Я пытаюсь реализовать 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
Итак, вот решение, которое сработало для меня. так как его особый вопрос, и я не получал никаких комментариев или ответов по этому поводу от тех, кто думал, что решение, которое сработало для меня, также может помочь любому, кто сталкивается с такими же проблемами в будущем.
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());
}