mockito 在可完成的future supply async下模拟静态对象

tktrz96b  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(84)

考虑下面的代码片段:

class XYZ {
  public static getFieldABC(){
    return new ABC();
  }
}

...
CompletableFuture.supplyAsync(() -> XYZ.getFieldABC())
...

字符串
我需要对这段代码进行单元测试。
我有一个静态方法getFieldABC,它返回一个特定类ABC的对象。我想使用Mockito.mockStatic模拟这个静态方法调用,然后使用when()返回mockObject。
这里的问题是这个方法调用是在CompletableFuture.supplyAsync下。因为,它运行在不同的线程中,调用静态方法,而不是调用mock,它调用实际的方法调用。

dy1byipe

dy1byipe1#

假设您要测试的类如下所示

class ABCSupplier {

    void supply() {

        CompletableFuture.supplyAsync(XYZ::getFieldABC);
    }
}

字符串
您可以使用Mockito模拟静力学,如下所示:

@ExtendWith(MockitoExtension.class)
class ABCSupplierTest {

    @InjectMocks
    ABCSupplier abcSupplier;

    @Captor
    private ArgumentCaptor<Supplier<ABC>> supplierArgumentCaptor;

    @Test
    void it_should_supply_ABC_field() {

        final ABC abc = new ABC();

        try (var completableFutureMockedStatic = Mockito.mockStatic(CompletableFuture.class);
            var xyzMockedStatic = Mockito.mockStatic(XYZ.class)) {

            xyzMockedStatic.when(XYZ::getFieldABC)
                .thenReturn(abc);

            this.abcSupplier.supply();

            completableFutureMockedStatic.verify(() -> CompletableFuture.supplyAsync(this.supplierArgumentCaptor.capture()));

            Assertions.assertThat(this.supplierArgumentCaptor.getValue().get())
                .isEqualTo(abc);
        }
    }
}

相关问题