小任务的持续调度是我的应用程序的核心概念。大多数方法都是静态的,有两种形式:公共方法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也没有帮助。当我想检查是否已在具有间谍的对象上调用方法时,它会忽略在其他线程中进行的调用。这将是唯一的呼叫,主要是。
由于我更倾向于测试公共API,而不是被迫将100%的方法公开(或者甚至是包私有),我需要一种方法来确保安排所有任务到ThreadPool被执行并正确处理。有没有办法做到这一点?或者是否有另一个库(或一些非常稳定的JUnit扩展)我可以查看一下?