在thenReturn时使用mockito并使用新对象

7eumitmz  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(176)

在我的实现中有以下代码行:

myService.getTypes(new TypeRequest(myList.stream().map(Object::toString)
                        .collect(Collectors.toList())))

我试着在我的测试课上模仿上面的内容:

when(myService.getTypes(new TypeRequest(Lists.newArrayList("15", "16"))))
                .thenReturn(Lists.newArrayList(type1, type2));
when(myService.getTypes(new TypeRequest(Lists.newArrayList("25", "26"))))
                .thenReturn(Lists.newArrayList(type3, type4));

但是当我调试测试代码时,我可以看到myService.getTypes返回一个空列表,这是什么问题呢?
还有,有没有办法使用args来简化上面的模拟?我发现的只是使用传递到方法中的args,而不是传递到方法中的args的args。

nvbavucw

nvbavucw1#

找到了解决办法:

when(myService.getTypes(any(TypeRequest.class)))
    .thenAnswer(invocationOnMock -> {
        TypeRequest r = invocationOnMock.getArgument(0);
        //if r contains "15"
            return Lists.newArrayList(type1, type2);
        } else {
            return Lists.newArrayList(type3, type2);
        }
});
vnzz0bqm

vnzz0bqm2#

默认情况下,它使用输入参数的equals()来检查它是否与任何存根参数匹配。很可能您没有实现TypeRequestequals(),因此没有匹配的存根参数,因此它返回未存根调用的默认结果,这是一个空列表。
如果不想为TypeRequest实现equals(),正确的方法是使用argThat()为输入参数定义一个ArgumentMatcher

@Test
public void someTest(){

    when(myService.getTypes(argThat(requestListContainAll(Lists.newArrayList("15", "16")))))
                  .thenReturn(Lists.newArrayList(type1, type2));
    myService.getTypes(Lists.newArrayList("15", "16"))); //it should return the above stubbed value
}

private ArgumentMatcher<TypeRequest> requestListContainAll(List<String> list){
    return arg-> arg.getList().containsAll(list);
}

相关问题