Junit Java8测试并发性

Junit Java8测试并发性,junit,java-8,executorservice,easymock,countdownlatch,Junit,Java 8,Executorservice,Easymock,Countdownlatch,所以 我有一个实用程序类,它在给定的时间段内初始调用未返回后执行重试(理论上,对任何内容),并持续执行重试,直到任何源返回数据或所有数据都已用尽。这将使用ExecutorCompletionService的.poll方法来触发何时重试。有关实用程序类,请参见以下代码 final RetrySources[] retrySources = getRetrySources(originalSource); Future<T> resultFuture = null; final Lis

所以

我有一个实用程序类,它在给定的时间段内初始调用未返回后执行重试(理论上,对任何内容),并持续执行重试,直到任何源返回数据或所有数据都已用尽。这将使用
ExecutorCompletionService
.poll
方法来触发何时重试。有关实用程序类,请参见以下代码

final RetrySources[] retrySources = getRetrySources(originalSource);

Future<T> resultFuture = null;
final List<Future<T>> futures = new ArrayList<>(retrySources.length);
for (int tryIndex = 0; tryIndex < retrySources.length && resultFuture == null; tryIndex++) {
    final int tryIndexCopy = tryIndex;
    futures.add(ecs.submit(() -> client.call(retrySources[tryIndexCopy], tryIndexCopy)));
    resultFuture = ecs.poll(millisBeforeRetry, TimeUnit.MILLISECONDS);
}

if (resultFuture == null) {
    resultFuture = ecs.take();
}

return resultFuture.get();
…请注意,my
ExecutorCompletionService
已定义

private final ExecutorCompletionService executorCompletionService = new ExecutorCompletionService(Executors.newFixedThreadPool(2));
…由于我的测试是在主线程中运行的,而每次调用都是作为
ExecutorCompletionService
池的一部分运行它自己的线程,我不明白为什么要使用
signal1.await()
会导致测试永远旋转,并注意注释,即切换这一行进行睡眠会导致测试通过


非常感谢您的帮助。

这可能是由于
重播(mockReadOperation)激活(执行)模拟的位置

注意:我从未使用过easy mock,但是快速的google显示,
replay
激活了mock,这似乎符合答案,我可能错了


如果我是对的,并且您总是必须在easymock中回放模拟,那么解决方案可能是,切换到Mockito:p

你能提供一个完全工作的测试用例吗?我想复制一下。我怀疑EasyMock同步中存在死锁。我认为你是对的;在每次测试中,从EasyMock切换到Stubing操作似乎已经解决了这个问题!但不确定为什么会出现这种情况……可能是因为
replay
在需要模拟之前执行模拟。
replay
方法不执行模拟<代码>重播
将模拟设置为某种“准备使用”状态。
private final ExecutorCompletionService executorCompletionService = new ExecutorCompletionService(Executors.newFixedThreadPool(2));