不覆盖Resultsetextractor匿名类的代码。
在运行时没有异常,它运行良好。
我们使用以下示例代码模拟了jdbcTemplate。
Mockito.when(mainTemplate.query(QUERY,new HashMap(),rs))。thenReturn(new Object());
执行后不覆盖下面的代码(以@Override注释开头-extractData()方法)。
返回mainTemplate.query(Query,paramMap,new ResultSetExtractor>(){
**@Override
public Map<String, Object> extractData(ResultSet resultSet)
throws SQLException, DataAccessException {
Map<String, Object> keyMap = new HashMap<String, Object>();
while (resultSet.next()) {
keyMap.put("key1",
resultSet.getString("data1"));
keyMap.put("key2", resultSet.getString("data2"));
}
return keyMap;
}**
});
请帮忙。
Please check sample code for your information.
**return jdbcTemplatre.query(Query, paramMap, new ResultSetExtractor<byte[]>() {
@Override
public byte[] extractData(ResultSet resultSet) throws SQLException,
DataAccessException {
byte[] data = null;
while (resultSet.next()) {
signature = resultSet.getBytes("data");
}
return data;
}
});**
Mockito.when(mainTemplate.query(Query, new HashMap<String,Object>(),rs)).thenAnswer(new Answer<Object>(){
@Override
public byte[] answer(InvocationOnMock invocationOnMock) throws Throwable {
ResultSetExtractor resultSetExtractor = invocationOnMock.getArgumentAt(2,ResultSetExtractor.class);
return (byte[]) resultSetExtractor.extractData(resSet);
}
});
最佳答案
不会覆盖ResultSetExtractor
代码,因为它永远不会执行。而且它不会执行,因为mainTemplate.query
调用是模拟的,因此永远不会触发ResultSetExtractor
回调。
您可以通过使用Mockitos thenAnswer在仍然使用模拟的同时触发它
Mockito.when(mainTemplate.query(QUERY, new HashMap(),rs)).thenAnswer(new Answer<Object>() {
@Override
public String answer(InvocationOnMock invocationOnMock) throws Throwable {
ResultSetExtractor resultSetExtractor = invocationOnMock.getArgumentAt(2, ResultSetExtractor.class);
resultSetExtractor.extractData(...);
return new Object();
}
});
或与Java 8
Mockito.when(mainTemplate.query(QUERY, new HashMap(),rs)).thenAnswer(invocationOnMock -> {
ResultSetExtractor resultSetExtractor = invocationOnMock.getArgumentAt(2, ResultSetExtractor.class);
resultSetExtractor.extractData(...);
return new Object();
});
但是以这种方式进行测试,您将必须自己创建一个
ResultSet
。但总的来说:在模拟中调用
resultSetExtractor.extractData
的这种方式可能会引起问题,因为它假设jdbcTemplate.query
方法如何在内部处理ResultSetExtractor。但是这种行为可能会改变,然后您的测试不再代表生产中实际发生的情况。