Junit测试已启动的正确线程数

kas*_*ere 3 java multithreading unit-testing

所以我有一个启动五个线程的方法.我想编写一个单元测试来检查五个线程是否已经启动.我怎么做?示例代码非常感谢.

Dan*_*den 5

而不是编写自己的方法来启动线程,为什么不使用一个Executor,可以注入你的类?然后你可以通过传递一个假人来轻松测试它Executor.

编辑:这是一个如何构建代码的简单示例:

public class ResultCalculator {
    private final ExecutorService pool;
    private final List<Future<Integer>> pendingResults;

    public ResultCalculator(ExecutorService pool) {
        this.pool = pool;
        this.pendingResults = new ArrayList<Future<Integer>>();
    }

    public void startComputation() {
        for (int i = 0; i < 5; i++) {
            Future<Integer> future = pool.submit(new Robot(i));
            pendingResults.add(future);
        }
    }

    public int getFinalResult() throws ExecutionException {
        int total = 0;
        for (Future<Integer> robotResult : pendingResults) {
            total += robotResult.get();
        }
        return total;
    }
}

public class Robot implements Callable<Integer> {
    private final int input;

    public Robot(int input) {
        this.input = input;
    }

    @Override
    public Integer call() {
        // Some very long calculation
        Thread.sleep(10000);

        return input * input;
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是您从以下方式调用它的方式main():

public static void main(String args) throws Exception {
    // Note that the number of threads is now specified here
    ExecutorService pool = Executors.newFixedThreadPool(5);
    ResultCalculator calc = new ResultCalculator(pool);
    try {
        calc.startComputation();
        // Maybe do something while we're waiting
        System.out.printf("Result is: %d\n", calc.getFinalResult());
    } finally {
        pool.shutdownNow();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是你如何测试它(假设JUnit 4和Mockito):

@Test
@SuppressWarnings("unchecked")
public void testStartComputationAddsRobotsToQueue() {
    ExecutorService pool = mock(ExecutorService.class);
    Future<Integer> future = mock(Future.class);
    when(pool.submit(any(Callable.class)).thenReturn(future);

    ResultCalculator calc = new ResultCalculator(pool);
    calc.startComputation();

    verify(pool, times(5)).submit(any(Callable.class));
}
Run Code Online (Sandbox Code Playgroud)

请注意,所有这些代码只是一个草图,我还没有测试过,甚至还没有尝试编译.但它应该让您了解代码的结构.