问题是我有两个argumentsCaptors,并且我需要使用Mockito.when().then()
两次,并将此argumentCaptors.capture()
放在when()
中的方法参数中。但是它每秒运行两次argumentCaptor.capture()
我知道在验证中我可以使用argumentCaptor.getAllValues().get(i)
,并获取当前argumentsCaptors的任何值,但是我找不到关于如何在{{ 1}}
capture()
我收到了两次orderBuy而不是orderSell,orderbuy
答案 0 :(得分:0)
Mockito.thenReturn()
通过使用vararg支持consecutive calls。因此,您可以将它们组合在一起:
ArgumentCaptor<Function<CurrencyPairDTO, String >> currencyPairCaptor = ArgumentCaptor.forClass(Function.class);
ArgumentCaptor<Function<MyOrdersSmartDTO, Set<String>>> myOrderSmartCaptor = ArgumentCaptor.forClass(Function.class);
when(recalculateInMemoryBoardUtils.fillSetByMarginOrdersUsingFunctions(eq(instancesByUsername), eq(currencyBase), currencyPairCaptor.capture(), myOrderSmartCaptor.capture())).thenReturn(ordersSell, ordersBuy);
然后按照您的建议使用getAllValues().get(0)
和getAllValues().get(1)
。
此外,最好返回一个空的Set
而不是对其进行模拟,因为模拟它会使以后的处理变得更加困难。例如,如果您的被测方法调用someSet.contains(someVal)
,则必须模拟基本的Set
操作才能使测试起作用。
答案 1 :(得分:0)
我们可以在这里thenAnswer()
使用并检查我们的参数
when(this.recalculateInMemoryBoardUtils.fillSetByMarginOrdersUsingFunctions(eq(instancesByUsername), eq(currencyBase), any(), any())).thenAnswer(
(Answer<Set<String>>) invocationOnMock -> {
Function<CurrencyPairDTO, String> function = invocationOnMock.getArgument(2);
CurrencyPairDTO currencyPairFunction = CurrencyPairDTO.builder()
.base(currencyBase)
.counter(currencyCounter)
.build();
String currency = function.apply(currencyPairFunction);
if (currencyBase.equals(currency)) {
return ordersBuy;
} else {
return ordersSell;
}
});