我正在尝试对这种方法进行单元测试:

/**
     * 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>`

10-06 09:10