В вашем примере не хватает контекста относительно того, что делает 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 (), как это использовать, см. пример выше.Надеюсь, это поможет?