Ошибка при запуске JUnit с методом getNamedParameterJdbcTemplate () в Spring Batch

1

Я пытаюсь реализовать JUnit для классов DAO в моем проекте Spring Batch. Поскольку я не хочу получить доступ к базе данных напрямую, я переопределяю методы класса jdbctemplate в своем JUnit.

Ниже приведен пример класса DAO и кода JUnit, который я использую

Классы DAO:

класс transDaoJdbcImpl

public class transDaoJdbcImpl extends jdbcAbstractDao {

    public tranVo fetchHistory(Integer feedFileId) {
        try {
            Map<String, Object> binding = new HashMap<String, Object>();
            binding.put("ID", "value");

            return super.getNamedParameterJdbcTemplate().queryForObject(
                    this.sSQL,
                    binding,
                    new testMapper());

        } catch (Exception e) {
            e.printstacktrace();
        }
    }

}

class DistbatchAbstractDao {
    public abstract class DistbatchAbstractDao extends NamedParameterJdbcDaoSupport {
    protected int update(String sql, Map<String, ?> paramMap) throws Exception {
        try {
            return getNamedParameterJdbcTemplate().update(sql, paramMap);
        } catch (Exception e) {
            logger.error("update() error:\n" + e);
            throw e;
        }
    }

    ........
    other methods

}

Код JUnit:

NamedParameterJdbcTemplate template = 
    new NamedParameterJdbcTemplate(Mockito.mock(DataSource.class)) {

    @Override
    public <T> T queryForObject(String sql, Map<String, ?> paramMap, RowMapper<T> rowMapper)
            throws Exception {

        return null;
    }
};
transDaoJdbcImpl() dao = new transDaoJdbcImpl() {
    @Override
    public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {

        return template;
    }
};
ReflectionTestUtils.setField(dao, "SQLName", sql);
dao.fetchHistory(1099999);

когда я запускаю JUnit fetchHistory() в файле transDaoJdbcImpl. и так как я делаю super.getNamedParameterJdbcTemplate().queryForObject метод NamedParameterJdbcTemplate. Я не хочу этого, но я хочу получить getNamedParameterJdbcTemplate() который я переопределил в своем JUnit чтобы быть вызванным, поскольку я переопределяю функциональность. В настоящее время этого не происходит, и getNamedParameterJdbcTemplate() всегда имеет значение null в fetchHistory(). Может ли кто-нибудь дать мне знать, как я могу это сделать, и в чем проблема с моим кодом выше. любая помощь была бы замечательной, поскольку я застрял на ней уже давно.

благодаря

Vikeng21

Теги:
spring
batch-processing
dao

1 ответ

2

Итак, вот решение, которое сработало для меня. так как его особый вопрос, и я не получал никаких комментариев или ответов по этому поводу от тех, кто думал, что решение, которое сработало для меня, также может помочь любому, кто сталкивается с такими же проблемами в будущем.

Soution: код JUnit

private transDaoJdbcImpl dao;
/**
 * @throws java.lang.Exception
 */
@SuppressWarnings("unchecked")
@Before
public void setUp() throws Exception {
    dao=new transDaoJdbcImpl ();
    tranVo vo=new tranVo ();
    vo.setId(1);
    NamedParameterJdbcTemplate jdbcTemplateMock = Mockito.mock(NamedParameterJdbcTemplate.class);
    ReflectionTestUtils.setField(dao, "namedParameterJdbcTemplate", jdbcTemplateMock);
    Mockito.when(jdbcTemplateMock.queryForObject(Mockito.anyString(),Mockito.anyMap() ,Mockito.any(RowMapper.class))).thenReturn(vo);
}


@Test
public void testFetchHistory() {
    tranVo vo=dao.retrieveLatestHistory(1);

    Assert.assertEquals("TEST",vo.getCd());
}
  • 0
    Хороший ответ, мне очень помог

Ещё вопросы

Сообщество Overcoder
Наверх
Меню