Mockito,验证其中一个方法调用

时间:2017-11-22 00:36:36

标签: java junit mockito

我正在用mockito编写一个Junit测试,我想验证一个方法调用。问题是有多个方法调用使用不同的参数,我想只验证其中一个。

Eg : Below are 3 method calls from my code
Metrics.emit(PhoneFailCount,0);
Metrics.emit(PaymentFailCount,1);
Metrics.emit(AddresseFailCount,1);

如何验证

Metrics.emit(PaymentFailCount,1)至少被称为一次。

如果我直接做 verify(Metrics).emit(PaymentFailCount, 1) 它会引发错误,说参数是不同的!因为它试图与Metrics.emit(PhoneFailCount,0)匹配

我尝试使用ArgumentCaptor,但无法一次捕获这两个参数

由于

3 个答案:

答案 0 :(得分:1)

您可以将ArgumentCaptor用于此目的。谢谢这个代码如下。这应该工作

ArgumentCaptor<String> captor1 = ArgumentCaptor.forClass(String.class);

ArgumentCaptor<Integer> captor2 = ArgumentCaptor.forClass(Integer.class);

verify(Metrics, times(3)).emit(captor1.capture(), captor2.capture);

List<Integer> values = captor2.getAllValues;
//assertIf values have values 0,1 and 1

答案 1 :(得分:0)

使用这样的代码:

Metrics metrics = mock(Metrics.class);

// run code that uses metrics

verify(metrics, times(3)).emit(any(), anyInt());
verify(metrics).emit(PaymentFailCount, 1);

所有静态导入都来自org.mockito.Mockito.*

注意:这种方式不会保留调用顺序,这意味着如果您重新排序测试仍会通过的emit次调用。

答案 2 :(得分:0)

参数捕获者的替代方法是在Mockito.verify()中使用hamcrest匹配器,但您必须在验证时设置匹配规则:

verify(Metrics, times(1)).emit(eq(PaymentFailCount),eq(1));