Java 使用Mockito从链接方法捕获参数
我正在使用Mockito为现有类编写一些Java单元测试。但是,我在提取参数时遇到了问题,该类的对象使用这些参数作为嵌套调用的一部分调用方法 例如:Java 使用Mockito从链接方法捕获参数,java,unit-testing,testing,mockito,Java,Unit Testing,Testing,Mockito,我正在使用Mockito为现有类编写一些Java单元测试。但是,我在提取参数时遇到了问题,该类的对象使用这些参数作为嵌套调用的一部分调用方法 例如: public class SomeClass { public SomeClass() { //... } public someMethod(Foo foo) { // Bar bar = ... someOtherMethod(bar); } private someOtherMethod(Ba
public class SomeClass {
public SomeClass() {
//...
}
public someMethod(Foo foo) {
// Bar bar = ...
someOtherMethod(bar);
}
private someOtherMethod(Bar bar) {
//...
}
}
我想捕获
someOtherMethod()
的参数,并验证bar
是否应该是它。我可以使用Mockito中的ArgumentCaptor
或其他功能来实现这一点吗?一个选项是使用存储这些参数的类重写SomeClass,并使其可供您验证。一个优雅的选择是。模仿其他方法不太可能为您提供有用的结果someMethod
是公共API的一部分,但someOtherMethod
不是;一般来说,测试契约(someMethod的返回值和副作用)很重要,但测试实现(someMethod调用的私有方法)却是一种反模式
理想情况下,只需测试 SoMeMeod 的结果和副作用,并将其实现视为一个黑箱。你甚至不需要用Mockito来做这个。这是测试驱动开发的最纯粹的形式:它使您可以重构someMethod
,可能完全省略对someOtherMethod
的调用,或者在不编辑测试的情况下缓存结果(等等)
- 如果
someOtherMethod
调用外部服务,请将其设置为SomeClass实例上的可访问或可设置字段,并模拟该服务。
与其他服务的互动可以合理地视为总合同的一部分;这就是Mockito的设计初衷
- 如果代码>某个其他方法是足够独立的,您想单独测试代码> SOMMESOD ,请考虑将其封装为私有的或受保护的。这样,您就可以在测试中用一个虚拟实现覆盖它,也可能在代码的其他地方——毕竟,它现在是
someMethod
契约的测试部分,对吗?如果它是大的或不透明的,你也可以考虑把它变成一个单独的可模仿类。
另请参见Programmers.SE中的或StackOverflow上的。是
@Spy
private SomeClass someClassSpy;
@Captor
private ArgumentCaptor<Bar> barCaptor;
...
verify(someClassSpy).someOtherMethod(barCaptor.capture());
Bar bar = barCaptor.getValue();
assertThat(bar, is(...));
@Spy
私人侦探;
@俘虏
私人捕鲸人;
...
验证(someClassSpy).someOtherMethod(barCaptor.capture());
Bar=barCaptor.getValue();
(律师事务所,是(…);
其他方法是否调用另一个类上的方法?@EricF:是的。我将在该边界处进行捕获。