Mockito doAnswer & thenReturn在一个方法中的用法

7
我有一个问题,我的方法会返回某些对象,方法包含一些参数,我需要根据返回的响应和其中一个参数来设置条件。
Map<String,List<Object>> testMap = new HashMap<>(); 
Object obj = new Object(); 

Set<String> test = myService.getModelSearchStrings(testMap, obj);
if(CollectionUtils.isNotEmpty(test){

}

if(MapUtils.isNotEmpty(testMap){

}

测试:

Set<String> result = new HashSet<>();
result.add("123");

Mockito.when(mockedMtnService.getModelSearchStrings(Mockito.anyMap(), Mockito.anyObject())).thenReturn(result);

我希望返回一个虚拟的响应,即结果散列表,并更新参数值(映射)。


我不太确定这个问题,代码看起来还可以。也许你应该发布一个完整的例子(代码和测试),以及错误消息或期望/意外行为。 - Roland Weisleder
1个回答

16
我只能假设你正在寻找thenAnswerAnswer。使用thenAnswer,您可以修改模拟方法的参数,并从该方法返回结果。
例如:
Set<String> result = new HashSet<>();
result.add("123");

Mockito.when(mockedMtnService.getModelSearchStrings(Mockito.anyMap(), Mockito.anyObject())).thenAnswer(new Answer<Set>() {
    @Override
    public String answer(InvocationOnMock invocation) throws Throwable {
        Map<String,List<Object>> mapArg = (Map<String,List<Object>>)invocation.getArguments()[0];
        // do something with mapArg....
        return result;
    }
});

或者使用Java 8 Lambda表达式:

Mockito.when(mockedMtnService.getModelSearchStrings(Mockito.anyMap(), Mockito.anyObject())).thenAnswer(invocation -> {
    Map<String,List<Object>> mapArg = (Map<String,List<Object>>)invocation.getArguments()[0];
    // do something with mapArg....
    return result;
});

完全不相关:我看到你在 https://stackoverflow.com/review/triage/20799771 的分类队列中被标记为“编辑”...简单来说:错误的决定。这个问题需要 OP 删除屏幕截图,并将相应的文本作为文本放入问题中。只有 OP 应该做这样的事情。所以请记住:只有当其他人可以编辑问题时,才进行分类编辑。任何需要所有者改进内容的事情都不应该被“编辑”。 - GhostCat
类似于 https://stackoverflow.com/questions/52234471/how-to-calculate-the-radius-of-different-locations-locations-lat-and-long-are ... 除了原帖作者以外,没有任何其他人能够改进这个问题。因此,请严肃对待 "编辑" 的分类工作,更加谨慎。 - GhostCat
哇,这让我的一天变得美好,谢谢!有时候编写针对复杂和糟糕代码方法的测试很困难。 - Tanatarca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接