Java 如果使用CompletableFuture异步调用,如何模拟方法返回类型

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

我创建了一个包含100个线程的线程池,并调用了三个异步调用。在编写单元测试时,如何模拟返回如下对象的异步调用:

  • 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);
    
    }