gpt4 book ai didi

java - 朱单元 : get method of CompletableFuture never return

转载 作者:行者123 更新时间:2023-12-02 10:08:31 25 4
gpt4 key购买 nike

在我的 Spring boot 应用程序中,我有以下两种方法,我正在为 method1 和模拟方法 processQuery() 编写 JUnit。但我不知道为什么当控件到达 result.get() 时,它被卡住了,不再继续前进。

Method 1:
public class Entry(){
public string method1(){
--some process and then calling method 2
CompletableFuture<ExecutionResult> result =
risk.processQuery(graphQLRequest, context);
**result.get();** **--Control got stuck here**
system.out.println("control not reaching here ");
}
}

**TestClass ::**

public class testMain(){
@InjectMock
Entry entry;
@Mock
Risk risk;

@Before
public void setup() {
entry= new Entry();
MockitoAnnotations.initMocks(this);
}

@Test
public void testMethod1(){
CompletableFuture<ExecutionResult> result = new
CompletableFuture<ExecutionResult>();


Mockito.doReturn(result).when(risk).processQuery(Mockitt.anyString(),Mockito.any());

entry.method1();
}

Kinde 帮助我解决了上述问题。

最佳答案

你在 mock risk.processQuery()未完成CompletableFuture

CompletableFuture<ExecutionResult> result = new CompletableFuture<ExecutionResult>();
Mockito.doReturn(result).when(risk).processQuery(Mockitt.anyString(),Mockito.any());

当您调用get()时在CompletableFuture上,它会等待,直到完成并出现值或异常。在这里,你的 future 永远不会完成,所以它无限期地等待。

这里有三个解决方案:

  • 定义您的模拟,使其返回一个已经完成的 future:

    CompletableFuture<ExecutionResult> result = CompletableFuture.completedFuture(someResult);
  • 调用测试电话 entry.method1()在单独的线程中(例如使用 CompletableFuture.supplyAsync() ),然后使用 result.complete(someResult) 完成结果在测试中;

  • 重构您的代码,使得 method1()也变得异步,比如:

    public CompletableFuture<String> method1(){
    --some process and then calling method 2
    CompletableFuture<ExecutionResult> result =
    risk.processQuery(graphQLRequest, context);
    return result.thenApply(result -> result.toString());
    }

    然后调整您的测试以模拟异步响应:

    @Test
    public void testMethod1(){
    CompletableFuture<ExecutionResult> result = new CompletableFuture<ExecutionResult>();
    Mockito.doReturn(result).when(risk).processQuery(Mockitt.anyString(),Mockito.any());

    CompletableFuture<String> method1Result = entry.method1();
    result.complete(someResult);
    assertEquals("some String", method1Result.join());
    }

关于java - 朱单元 : get method of CompletableFuture<ExecutionResult> never return,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55162706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com