Mockito.when()内第二次ArgumentCaptor.capture()

时间:2019-05-24 08:23:33

标签: java spring testing junit

问题是我有两个argumentsCaptors,并且我需要使用Mockito.when().then()两次,并将此argumentCaptors.capture()放在when()中的方法参数中。但是它每秒运行两次argumentCaptor.capture()

我知道在验证中我可以使用argumentCaptor.getAllValues().get(i),并获取当前argumentsCaptors的任何值,但是我找不到关于如何在{{ 1}}

capture()

我收到了两次orderBuy而不是orderSell,orderbuy

2 个答案:

答案 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; } });