Java 如果使用CompletableFuture异步调用,如何模拟方法返回类型
我创建了一个包含100个线程的线程池,并调用了三个异步调用。在编写单元测试时,如何模拟返回如下对象的异步调用:Java 如果使用CompletableFuture异步调用,如何模拟方法返回类型,java,spring-boot,junit,mockito,powermockito,Java,Spring Boot,Junit,Mockito,Powermockito,我创建了一个包含100个线程的线程池,并调用了三个异步调用。在编写单元测试时,如何模拟返回如下对象的异步调用: LocationDetail(最终信息、地点信息) pgData(最终信息、pgInformation) userContactData(最终信息,userContactList) ExecutorService=Executors.newFixedThreadPool(100); Set callables=newhashset(); UserInformation finalUse
LocationDetail(最终信息、地点信息)
pgData(最终信息、pgInformation)
userContactData(最终信息,userContactList)
ExecutorService=Executors.newFixedThreadPool(100);
Set callables=newhashset();
UserInformation finalUserInformation=用户信息;
add(newcallable()){
@凌驾
公共字符串调用()引发JsonProcessingException{
返回位置详细信息(最终信息、地点信息);
}});
add(newcallable()){
@凌驾
公共字符串调用()引发JsonProcessingException{
返回pgData(最终信息、PG信息);
}});
add(newcallable()){
@凌驾
公共字符串调用()引发JsonProcessingException{
返回用户联系人数据(最终信息、用户联系人列表);
}});
试一试{
List futures=service.invokeAll(可调用项);
for(未来:未来){
System.out.println(future.get());
}
}捕获(例外e){
系统输出打印ln(e);
}
理想情况下,您的三个方法调用应该属于一个依赖项,然后像往常一样进行模拟。由于您的方法是阻塞的,并且调用的顺序似乎并不重要,所以正常的单元测试之间没有真正的区别。如果您不能使用spy重构代码,则可以选择.when(service1.LocationDetail(anyString()).thenReturn(information1);当(service2.pgData(anyString())。然后返回(information2);当(service3.usercontactData(anyString())。然后返回(information3);我同步地模仿,但它没有被模仿。我得到“null”值请编辑您的问题并添加完整且可运行的单元测试。还可以使用周围的方法、相关类及其构造函数更新代码。如果您这样做,我们可以检查错误来自何处。如果您可以提供所有之前要求的内容,或者更好地提供一个包含最小值的小项目来重现错误!许多人在构建这些示例项目时找到了解决方案
ExecutorService service = Executors.newFixedThreadPool(100);
Set<Callable<String>> callables = new HashSet<Callable<String>>();
UserInformation finalUserInformation = userInformation;
callables.add(new Callable<String>() {
@Override
public String call() throws JsonProcessingException {
return LocationDetail(finalUserInformation,placeInformation);
}});
callables.add(new Callable<String>() {
@Override
public String call() throws JsonProcessingException {
return pgData(finalUserInformation,pgInformation);
}});
callables.add(new Callable<String>() {
@Override
public String call() throws JsonProcessingException {
return usercontactData(finalUserInformation,userContactList);
}});
try {
List<Future<String>> futures = service.invokeAll(callables);
for (Future<String> future : futures) {
System.out.println(future.get());
}
} catch (Exception e) {
System.out.println(e);
}