小任务的不断调度是我的应用程序的核心概念 . 大多数方法都是静态的,有两种形式:公共方法 executeSomeAction(Some param) ,它计划执行其私有对应方: ThreadPool.execute(() -> someAction()) .

事情是 - 大多数方法被切割成可以同时执行的小任务,虽然它们确实将单独的函数调用传递给ThreadPool,但我宁愿将这些“较小”的方法保持为静态和私有 . 毋庸置疑,编写一个检查静态方法是否被执行的测试并不容易,就像对象一样 . 我对性能和整体应用程序结构(专注于不可变数据和多线程执行)感到满意,但我不知道如何为这些东西编写单元测试 .

例如 - 我最近意识到,即使是核心方法测试......总是会因为在子线程上执行而不是主测试而执行:

@Test
public void shouldExecutePassedRunnables() {
    final int expectedCounterValue = 1;
    final AtomicInteger counter = new AtomicInteger();
    ThreadPool.execute(() -> {
        counter.getAndIncrement();
        ThreadPool.execute(() -> Assert.assertEquals(Tests.shouldSucceed("Counter incrementation"),
                counter.get(), expectedCounterValue));
    });
    ThreadPool.awaitTermination(Tests.DEFAULT_DELAY);
}

地狱,我甚至把Assert.fail()和调试日志放在执行的函数上,以确保我是对的 . 它只是忽略其他线程中的Assert调用 .

Mockito也没有帮助 . 当我想检查是否已在具有 Spy 的对象上调用方法时,它会忽略在其他线程中进行的调用 . 大多数情况下,这将是唯一的通话 .

因为我宁愿测试公共API而不是被迫将100%的方法公开(或者甚至是包私有),我需要一种方法来确保调度到ThreadPool的所有任务都被执行并妥善处理 . 有没有办法做到这一点?或者是否有另一个库(或一些非常稳定的JUnit扩展)我可以研究一下?