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类型(对象为空)
要修复,请用 when
和 thenReturn
记录您的期望
更新
@Test
public void validateContainerTestWithNullData(){
CacheItemId cacheItemId = null;
String container = null;
when(splunkService.doExecuteQuery(any())).thenReturn(CompletableFuture.completedFuture("completedVal"));
assertFalse(containerValidatorImpl.validateContainer(cacheItemId,container));
}
想要对包含调用 @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类型(对象为空)
要修复,请用 when
和 thenReturn
更新
@Test
public void validateContainerTestWithNullData(){
CacheItemId cacheItemId = null;
String container = null;
when(splunkService.doExecuteQuery(any())).thenReturn(CompletableFuture.completedFuture("completedVal"));
assertFalse(containerValidatorImpl.validateContainer(cacheItemId,container));
}