我正在尝试使用mockito来模拟jdbcTemplate并调用方法查询,并使用Object[]{}向其传递参数。
我正在为我的 DAO 层进行单元测试,我想模拟 jdbcTemplate 并调用方法查询并使用 Object[] {} 传递 sql 字符串、RowMapper 和参数
public List<EntityType> myDaoMethod(Date fechaInicio, Date fechaFin)
throws NotDataFoundException {
log.info("entering => myDaoMethod");
log.info("param => fechaInicio :" + fechaInicio);
log.info("param => fechaFin :" + fechaFin);
log.debug("Se ejecutando consulta...");
try {
List<EntityType> query = jdbcTemplate.query(QueryStrs.MY_QUERY,
new Object[] {fechaInicio, fechaFin},
new BeanPropertyRowMapper<EntityType>(EntityType.class));
log.debug("Se ejecuto consulta. ");
return query;
}catch(DataAccessException e) {
log.error("No se encontro informacion en la consulta myDaoMethod (2)", e);
throw new NotDataFoundException(e);
}finally {
log.info("exiting => myDaoMethod");
}
}
@Mock
private JdbcTemplate jdbcTemplate;
@Test
public void myTestMethod() throws NotDataFoundException {
List<EntityType> listValue = new ArrayList<>();
listValue.add(new EntityType((short) 2, "modem 2"));
listValue.add(new EntityType((short) 1, "modem"));
when(jdbcTemplate.query(any(String.class),any(Object[].class), any(BeanPropertyRowMapper.class))).thenReturn(listValue);
MyDao dao = new MyDaoImpl(jdbcTemplate);
List<EntityType> otrasAdicionalesPorRangoFecha = dao.myDaoMethod(any(Date.class), any(Date.class));
Assert.assertNotNull(otrasAdicionalesPorRangoFecha);
Assert.assertTrue(!otrasAdicionalesPorRangoFecha.isEmpty());
// Assert.assertArrayEquals(listValue.toArray(), otrasAdicionalesPorRangoFecha.toArray());
}
跟踪结果为
org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 参数匹配器的使用无效! 预计 3 名匹配者,记录 2 名: -> 在 com.oracle.reporter.tddtest. rhhcomision.OtrasAdicionalesDaoTest.testBuscarOtrasAdicionalesPorFecha(OtrasAdicionalesDaoTest.java:80) -> 在 com.oracle.reporter.tddtest. rhhcomision.OtrasAdicionalesDaoTest.testBuscarOtrasAdicionalesPorFecha(OtrasAdicionalesDaoTest.java:80)
如果匹配器与原始值组合,则可能会发生此异常: //不正确: someMethod(anyObject(), "原始字符串"); 使用匹配器时,所有参数都必须由匹配器提供。 例如: //正确的: someMethod(anyObject(), eq("匹配器的字符串"));
最佳答案
问题是你的 dao
不是一个模拟对象,所以你不应该
此时传递匹配器。
错误:
dao.myDaoMethod(any(Date.class), any(Date.class));
正确:
dao.myDaoMethod(new Date(1), new Date(2));
关于java - 如何使用参数模拟 jdbcTemplate.query (Object[]{}),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56781355/