Mockito的论点Captor的例子

2022-08-31 06:22:13

任何人都可以给我一个例子,说明如何使用这个类,以及它与提供mojito的简单匹配器有何不同。org.mockito.ArgumentCaptor

我阅读了提供的嘲笑文件,但这些文件没有清楚地说明它,没有一个能够清楚地解释它。


答案 1

我同意@fge说的话,更多了。让我们看一下示例。假设您有一种方法:

class A {
    public void foo(OtherClass other) {
        SomeData data = new SomeData("Some inner data");
        other.doSomething(data);
    }
}

现在,如果要检查内部数据,可以使用 captor:

// Create a mock of the OtherClass
OtherClass other = mock(OtherClass.class);

// Run the foo method with the mock
new A().foo(other);

// Capture the argument of the doSomething function
ArgumentCaptor<SomeData> captor = ArgumentCaptor.forClass(SomeData.class);
verify(other, times(1)).doSomething(captor.capture());

// Assert the argument
SomeData actual = captor.getValue();
assertEquals("Some inner data", actual.innerData);

答案 2

两个主要区别是:

  • 当你捕获一个参数时,你能够对这个参数进行更详细的测试,并使用更明显的代码;
  • 可以捕获多次ArgumentCaptor

为了说明后者,假设您有:

final ArgumentCaptor<Foo> captor = ArgumentCaptor.forClass(Foo.class);

verify(x, times(4)).someMethod(captor.capture()); // for instance

然后,捕获器将能够让您访问所有4个参数,然后您可以单独执行断言。

实际上,这个或任何数量的参数,因为a不限于固定数量的调用;无论如何,如果您愿意,绑架者将为您提供访问所有这些内容的权限。VerificationMode

这还有一个好处,即这样的测试(恕我直言)比必须实现自己的测试更容易编写 - 特别是如果你将mojito与assertj相结合。ArgumentMatcher

哦,请考虑使用TestNG而不是JUnit。


推荐