我正在用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,但无法一次捕获这两个参数
由于
答案 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));