首页 > 解决方案 > 带有 mockito 的多线程类的 junit

问题描述

请帮助我使用 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
    }
}

标签: junitmockitorunnableprivate-methods

解决方案


您的示例缺少关于 methodB 正在做什么的上下文......在不知道您要验证的功能是什么的情况下,仅验证 methodB 被调用并不是一个特别有用的测试,也不是模拟 BlockingQueue。我将冒险并假设 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() 的地方,请参阅上面的示例以了解如何使用。希望这有帮助吗?


推荐阅读