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);
4条答案
按热度按时间zqdjd7g91#
我同意@fge所说的,更多。让我们看一个例子。假设你有一个方法:
现在,如果您想检查内部数据,可以使用captor:
cpjpxq1n2#
两个主要区别是:
当你捕捉到一个参数时,你就可以对这个参数进行更详细的测试,并且使用更明显的代码;
一
ArgumentCaptor
可以捕获多次。为了说明后者,假设你有:
然后捕获者将允许您访问所有4个参数,然后您可以分别对这些参数执行Assert。
事实上,由于
VerificationMode
不限于固定的调用次数;在任何情况下,如果你愿意的话,俘虏者会让你接触到所有的人。这样做还有一个好处,即这样的测试(imho)比实现自己的测试要容易得多
ArgumentMatcher
特别是如果你把mockito和assertj结合起来。哦,请考虑使用testng而不是junit。
bfhwhh0e3#
进行全面检查的步骤如下:
准备好俘虏:
验证对dependent-on-component(被测主体的合作者)的调用次数(1)是否为默认值,因此需要添加它。
时间(1)是默认值,因此不需要添加它。
将参数传递给合作者
someargument可用于Assert
tyu7yeag4#
这里我给你一个回调方法的恰当例子。所以假设我们有一个类似method login()的方法:
我还将所有helper类放在这里,以使示例更清楚:loginservice类
我们的listener loginlistener为:
}
现在我只想测试login类的login()方法
也别忘了在测试类上面添加注解