Unit testing 如何对具有完整特性的方法进行单元测试<;用户定义对象>;。是否使用Mockito提供同步(()->;someMethodWithReturn())?

Unit testing 如何对具有完整特性的方法进行单元测试<;用户定义对象>;。是否使用Mockito提供同步(()->;someMethodWithReturn())?,unit-testing,junit,mockito,completable-future,Unit Testing,Junit,Mockito,Completable Future,我有一个控制器类,它有一个方法something(),该方法调用同一类的两个不同方法,并合并两个调用的结果 class Controller{ ... public UDC doSomething(){ CompletableFuture<UDC> feature1 = CompletableFuture.supplyAsync(()-> {this.doOther()}).exceptionally(ex -> {return new SomeExcep

我有一个控制器类,它有一个方法something(),该方法调用同一类的两个不同方法,并合并两个调用的结果

class Controller{
  ...
  public UDC doSomething(){
    CompletableFuture<UDC> feature1 = CompletableFuture.supplyAsync(()-> {this.doOther()}).exceptionally(ex -> {return new SomeException();});

    CompletableFuture<UDC> feature2 = CompletableFuture.supplyAsync(()-> {this.doSomeOther()}).exceptionally(ex -> {return new SomeException();});
    ...
    return feature1.combine(feature2).get();

  }
...
}
类控制器{
...
公共UDC剂量测定法(){
CompletableFuture feature1=CompletableFuture.supplyAsync(()->{this.doOther()})。异常(ex->{return new SomeException();});
CompletableFuture feature2=CompletableFuture.supplyAsync(()->{this.doSomeOther()})。异常(ex->{return new SomeException();});
...
返回feature1.combine(feature2.get();
}
...
}

我认为你不应该用Mockito来模拟
可完成的未来
在这里,他们中的任何一个

在测试中,将控制器的
doSomething
功能视为一个黑匣子,给出一些输入返回
UDC

现在,有可能
doOther
和/或
doSomeOther
调用一些应该被模拟的外部代码。在这种情况下,
控制器
可能如下所示:

class Controller {
    private final SomeExternalDependency dependency1;

    public Controller(SomeExternalDependency dependency1) {
       this.dependency1 = dependency1;
    }

    private UDC doOther() {
      ... 
      dependency1.foo();
      ...
    }

    private UDC toSomeOther() {
      ...
      dependency1.bar();
      ...
    }
}
在本例中,在测试中,您可以像往常一样使用mockito模拟依赖关系1:

class MyTest {

   @Test 
   public void doSomething() {

      SomeExternalDependency dep = Mockito.mock(SomeExternalDependency.class);
      // specify the expectations
      Controller controller = new Controller(dep);

      controller.doSomething(); 

   }
}