如何用参数模拟 jdbcTemplate.query (Object[]{})
How to mock jdbcTemplate.query with parameters (Object[]{})
我正在尝试使用 mockito 模拟 jdbcTemplate 并调用使用 Object[]{} 传递参数的方法查询。
我正在为我的 DAO 层进行单元测试我想模拟 jdbcTemplate 并调用方法查询并传递 sql 字符串、一个 RowMapper 和使用 Object[] {}[=13= 的参数]
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.rrhhcomision.OtrasAdicionalesDaoTest.testBuscarOtrasAdicionalesPorFecha(OtrasAdicionalesDaoTest.java:80)
-> 在 com.oracle.reporter.tddtest.rrhhcomision.OtrasAdicionalesDaoTest.testBuscarOtrasAdicionalesPorFecha(OtrasAdicionalesDaoTest.java:80)
如果匹配器与原始值组合,可能会出现此异常:
//不正确:
一些方法(任何对象(),"raw String");
使用匹配器时,所有参数都必须由匹配器提供。
例如:
//正确的:
someMethod(anyObject(), eq("String by matcher"));
问题是你的 dao
不是模拟对象,所以你不应该
此时通过匹配器。
错误:
dao.myDaoMethod(any(Date.class), any(Date.class));
正确:
dao.myDaoMethod(new Date(1), new Date(2));
我正在尝试使用 mockito 模拟 jdbcTemplate 并调用使用 Object[]{} 传递参数的方法查询。
我正在为我的 DAO 层进行单元测试我想模拟 jdbcTemplate 并调用方法查询并传递 sql 字符串、一个 RowMapper 和使用 Object[] {}[=13= 的参数]
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.rrhhcomision.OtrasAdicionalesDaoTest.testBuscarOtrasAdicionalesPorFecha(OtrasAdicionalesDaoTest.java:80) -> 在 com.oracle.reporter.tddtest.rrhhcomision.OtrasAdicionalesDaoTest.testBuscarOtrasAdicionalesPorFecha(OtrasAdicionalesDaoTest.java:80)
如果匹配器与原始值组合,可能会出现此异常: //不正确: 一些方法(任何对象(),"raw String"); 使用匹配器时,所有参数都必须由匹配器提供。 例如: //正确的: someMethod(anyObject(), eq("String by matcher"));
问题是你的 dao
不是模拟对象,所以你不应该
此时通过匹配器。
错误:
dao.myDaoMethod(any(Date.class), any(Date.class));
正确:
dao.myDaoMethod(new Date(1), new Date(2));