Mockito - 分别验证同一方法的多个调用

时间:2016-02-10 16:25:04

标签: java mockito

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验证了哪些验证?

3 个答案:

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