import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.verify;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
public class MockitoTest {
public static class TestMock {
public void doIt(String s) {
}
}
public static void main(String[] args) {
TestMock mock = Mockito.mock(TestMock.class);
mock.doIt("1");
mock.doIt("2");
ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
verify(mock, atLeastOnce()).doIt(argument.capture());
System.out.println(argument.getValue());
verify(mock, atLeastOnce()).doIt(argument.capture());
System.out.println(argument.getValue());
}
}
我希望这会打印1 2
,但它会打印2 2
。似乎'1'调用丢失了。有没有办法可以验证1
然后2
验证了哪些验证?
答案 0 :(得分:30)
您可以拨打ArgumentCaptor.getAllValues()
而不是getValue()
。这将返回所有捕获的值:
返回所有捕获的值。捕获varargs或多次调用经过验证的方法时使用它。
在这种情况下,它会返回包含List<String>
和1
的{{1}}。
2
方法仅返回上次捕获的值:
返回参数的捕获值。
如果多次调用该方法,则返回最新捕获的值
在您的代码中,您可以使用更精确的getValue()
替换atLeastOnce()
,因为模拟被调用了2次。您不需要对times(2)
进行两次不同的调用来捕获参数:Mockito只需一次调用即可捕获传递给模拟的所有参数。
verify
答案 1 :(得分:4)
从getAllValues()
切换到getValues()
。它将返回它在模拟上执行的所有捕获的列表。
ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
verify(mock, atLeastOnce()).doIt(argument.capture());
System.out.println(argument.getAllValues().get(0));
verify(mock, atLeastOnce()).doIt(argument.capture());
System.out.println(argument.getAllValues().get(1));
答案 2 :(得分:4)
我最终需要的是使用calls()VerificationMode进行增量验证的有序验证
public static class A {
public void a(int x) {}
public void b() {}
}
public static void main(String[] args) {
A a = mock(A.class);
a.b();
a.a(1);
a.a(1);
a.a(2);
a.a(3);
a.a(4);
InOrder inOrder = Mockito.inOrder(a);
// Verifies [1,1]
inOrder.verify(a, calls(2)).a(1);
{
// Verifies [2]
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
inOrder.verify(a, calls(1)).a(argument.capture());
System.out.println(argument.getAllValues());
}
{
// Verifies [3,4]
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
inOrder.verify(a, calls(2)).a(argument.capture());
System.out.println(argument.getAllValues());
}
}