如何使用Mockito对具有CompletedFeature <UserDefinedObject> .supplyAsync(()-> someMethodWithReturn()))的方法进行单元测试?

我有一个控制器类,带有方法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();

  }
...
}
liufei0225 回答:如何使用Mockito对具有CompletedFeature <UserDefinedObject> .supplyAsync(()-> someMethodWithReturn()))的方法进行单元测试?

我认为您不应该在这里使用Mockito来模拟CompletableFuture,其中的任何一个...

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

现在,doOther和/或doSomeOther可能会调用一些应该被模拟的外部代码。在这种情况下,Controller可能看起来像这样:

class Controller {
    private final SomeExternalDependency dependency1;

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

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

    private UDC toSomeOther() {
      ...
      dependency1.bar();
      ...
    }
}

在这种情况下,您可以在测试中像往常一样使用mockito模拟出dependency1:

class MyTest {

   @Test 
   public void doSomething() {

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

      controller.doSomething(); 

   }
}
本文链接:https://www.f2er.com/2949378.html

大家都在问