Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Mockito从链接方法捕获参数_Java_Unit Testing_Testing_Mockito - Fatal编程技术网

Java 使用Mockito从链接方法捕获参数

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

我正在使用Mockito为现有类编写一些Java单元测试。但是,我在提取参数时遇到了问题,该类的对象使用这些参数作为嵌套调用的一部分调用方法

例如:

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:是的。我将在该边界处进行捕获。