gpt4 book ai didi

java - 使用 EasyMock 测试多线程(CompletableFuture)

转载 作者:行者123 更新时间:2023-12-01 17:55:58 24 4
gpt4 key购买 nike

我想为包含 CompletableFuture 的方法添加测试:

 public void report(List<String> srcList) {
if (srcList != null) {
...
CompletableFuture.runAsync(() ->
....
srcList.forEach(src-> downloader.send(url)));
}
}

我想测试一下,那个方法send叫做。我的测试如下:

 @Test
public void _test() {
List<String> events = new ArrayList();
events.add("http://xxxx//");
events.add("http://xxxx//");

expect(downloader.send(events.get(0))).andReturn("xxx").times(2);
replay(downloader);
eventReporter.report(events);

verify(downloader);
}

我收到这样的错误 Downloader.send("http://xxxx//"): expected: 2, actual: 0

避免此错误的一种方法是设置 Thread.sleep(100);暂停。然后线程将等待并验证该方法是否已调用。但这会增加测试时间。

还有其他方法可以使用 EasyMock 测试多线程吗?

最佳答案

使用 Thread.sleep() 方法对异步代码进行单元测试是一种不好的做法因为即使它有效,测试也会不稳定并闪烁(运行 3 次,2 次通过,1 次失败)如果您设置了较长的 sleep 时间并编写了一些这样的测试,那么您会遇到较长的执行时间可能会超过几十秒。为了完成此任务,您需要解耦异步部分你的代码来自同步。如何做到这一点的示例:

class Service {

private Downloader downloader;
private ExecutorService service;

public Service (Downloader downloader, ExecutorService service) {
//set variables
}

public void doWork(List<String> list) {
for (String item : list) {
service.submit(() -> {
downloader.download(item);
});
}
}
}

ExecutorService 是接口(interface),我们需要使我们的服务同步

class SycnronousService impliments ExecutorService {

//methods empty implementations

public void submit(Runnable runnable) {
runnable.run(); //run immediately
}

//methods empty implementations
}

public class ServiceTest {

public void shouldPassAllItemsToDownloader() {
Downloader mockDownloader = AnyMockFramework.mockIt();
Service service = new Service(mockDownloader, new SycnronousService());
List<String> tasks = Arrays.asList("A", "B");
service.doWork(tasks);
verify(mockDownloader).download("A"); //verify in your way with EasyMock
verify(mockDownloader).download("B"); //verify in your way with EasyMock
// no more Timer.sleep() , test runs immeadetely
}

}

您需要将 CompletableFuture 替换为我的示例中的内容,因为无法以这种方式对该代码进行单元测试。稍后在您的应用程序中,您将能够将 SycnronousService 替换为异步实现,并且所有内容都将按预期工作。

关于java - 使用 EasyMock 测试多线程(CompletableFuture),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44705831/

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