用于多线程的 junit class 和 mockito

junit for multi threaded class with mockito

请帮我使用 Mockito 为这段代码编写一个 JUnit 测试。

class A{
    private BlockingQueue<Runnable> jobQueue;

    public void methodA(List<String> messages) {
        try {
            jobQueue.put(() -> methodB(message));
        } catch(InterruptedException e) {}
    }

    private void methodB(Message message) {
        //other logic
    }
}

您的示例缺乏有关 methodB 正在做什么的上下文...不知道您要验证的功能是什么,仅验证 methodB 被调用不会是一个特别有用的测试,模拟也不是阻塞队列。我要冒险并假设 methodB 与另一个对象交互,而您真正想要验证的正是这种交互,如果是这种情况,我的代码和测试将类似于:

class A {
    private BlockingQueue<Runnable> jobQueue;
    private B b;

    public void methodA(Message message) {
        try {
            jobQueue.put(() -> methodB(message));
        } catch (InterruptedException e) {
        }
    }

    private void methodB(Message message) {
        b.sendMethod(message);
    }
}

class B {
    public void sendMethod(Message message) {
        // other logic
    }
}

我的测试可能类似于:

class Atest {

    private A testSubject;

    @Mock
    private B b;

    @Test
    public void testASendsMessage() {
        Message message = new Message("HELLO WORLD");
        testSubject.methodA(message);
        verify(b, timeout(100)).sendMethod(message);
    }

    @Before
    public void setup() throws Exception {
        testSubject = new A();
    }
}

一般来说,您希望避免在单元测试中使用多个线程验证位,保存多个 运行 线程的测试主要用于集成测试,但在需要的地方查看 Mockito.timeout( ), 请参阅上面的示例了解如何使用。希望这有帮助吗?