忽略在主线程外执行的JUnit Assert方法调用

时间:2014-12-16 22:19:49

标签: java multithreading unit-testing junit concurrency

小任务的持续调度是我的应用程序的核心概念。大多数方法都是静态的,有两种形式:公共方法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扩展)我可以查看一下?

0 个答案:

没有答案