Spring-开机|包含调用 @Async 方法的测试服务

Spring-Boot | Test Service Containing Call to @Async Method

想要对包含调用 @Aysnc 方法的服务进行单元测试,该方法 return CompletableFuture Object.But 未来对象始终为空(在测试期间)导致 NullPointerException。

future.get()导致错误

测试代码

@RunWith(MockitoJUnitRunner.class)
public class ContainerValidatorTest {

    @Mock
    QueryGenerator queryGenerator;

    @Mock
    SplunkService splunkService;

    @InjectMocks
    private ContainerValidatorImpl containerValidatorImpl;

    @Test
    public void validateContainerTestWithNullData(){
        CacheItemId cacheItemId = null;
        String container = null;
        assertFalse(containerValidatorImpl.validateContainer(cacheItemId,container));
    }
}

服务代码

@Override
    public boolean validateContainer(CacheItemId cacheItemId, String container) {
        Query query = queryGenerator.getUserDetailsFromCacheInfoQuery(cacheItemId);
        String response;
        try {
            CompletableFuture<String> future = splunkService.doExecuteQuery(query);
            response = future.get();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Error While Fetching User Details : "+ e.getLocalizedMessage());
        }
        System.out.println(response);
        JsonArray jsonArray = new JsonParser().parse(response).getAsJsonArray();
        if(!jsonArray.isJsonNull()) {
            return jsonArray.get(0).getAsJsonObject().get("TAG").getAsString().equalsIgnoreCase(container);
        }
        throw new RuntimeException("Not Able to Find UserDetails");
    }

  • 您还没有对 splunkService 模拟设置任何期望。
  • 然后你在模拟实例上调用 doExecuteQuery
  • 由于对方法调用没有期望,Mockito return方法的默认值return类型(对象为空)

要修复,请用 whenthenReturn

记录您的期望

更新

@Test
public void validateContainerTestWithNullData(){
    CacheItemId cacheItemId = null;
    String container = null;
    when(splunkService.doExecuteQuery(any())).thenReturn(CompletableFuture.completedFuture("completedVal"));
    assertFalse(containerValidatorImpl.validateContainer(cacheItemId,container));
}