Mockito - 在同一方法上单独验证多个调用

2022-09-01 06:41:46
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”调用丢失了。有没有办法验证验证是否发生了,然后?1 22 212


答案 1

你可以调用 ArgumentCaptor.getAllValues() 而不是 getValue()。这将返回所有捕获的值:

返回所有捕获的值。在捕获 varargs 或多次调用已验证方法时使用它。

在这种情况下,它将返回包含 和 。List<String>12

该方法仅返回上次捕获的值:getValue()

返回参数的捕获值。

如果多次调用该方法,则返回最新捕获的值

在代码中,您可以用更精确的替换,因为模拟被调用了 2 次。您不需要有两个不同的调用来捕获参数:Mockito只需一个调用即可捕获传递给模拟的所有参数。atLeastOnce()times(2)verify

TestMock mock = Mockito.mock(TestMock.class);
mock.doIt("1");
mock.doIt("2");

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
verify(mock, times(2)).doIt(argument.capture()); // verify that it was call 2 times and capture the values given

System.out.println(argument.getAllValues());

答案 2

从 切换到 。它将返回它对模拟执行的所有捕获的列表。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));

推荐