我正在尝试对这种方法进行单元测试:
/**
* finds all widget descriptions containing specified text
* @param searchText
* @return
*/
@Transactional
public List<Integer> returnWidgetIdsFromSearchWord(String searchText){
List<Integer> widgetIds = new ArrayList<Integer>();
MapSqlParameterSource args = new MapSqlParameterSource();
try{
widgetIds = (List<Integer>) jdbt.queryForList("SELECT idwidgets FROM descriptions "
+ "WHERE descriptiontext LIKE '%"+ searchText + "%'", args, Integer.class);
}catch(Exception e){
}
return widgetIds;
}
使用此 JUnit 测试:
@Test
public void testReturnWidgetIdsFromSearchWord(){
List<Integer> widgetIds = null;
when(jdbt.queryForList(Matchers.anyString(),
Matchers.any(MapSqlParameterSource.class),
Matchers.any(Integer.class))).thenReturn(idList);
widgetIds = (List<Integer>) dDao.returnWidgetIdsFromSearchWord("someText");
assertEquals(widgetIds, idList);
}
我试过只使用没有匹配器的 Integer.class - 没有运气,因为它提示需要 3 个匹配器。有什么建议么?谢谢
最佳答案
不要投 Matchers.anyVararg()
,有更好的解决方案。
方法 queryForList
有签名
queryForList(String sql, SqlParameterSource paramSource, Class<T> elementType)
所以而不是
when(jdbt.queryForList(Matchers.anyString(),
Matchers.any(MapSqlParameterSource.class),
Matchers.any(Integer.class))).thenReturn(idList);
用
when(jdbt.queryForList(Matchers.anyString(),
Matchers.any(MapSqlParameterSource.class),
Matchers.<Class<Integer>>any())).thenReturn(idList);
如 Mockito: Verifying with generic parameters 中所述
不要将代码与
anyVararg()
和强制转换一起使用when(jdbt.queryForList(Matchers.anyString(),
Matchers.any(MapSqlParameterSource.class),
(Class<Object>) Matchers.anyVararg()).thenReturn(idList);
因为这会产生警告
Unchecked cast: `java.lang.Object` to `java.lang.Class<java.lang.Object>`