请帮助我使用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与另一个对象进行交互,而这是您真正想验证的相互作用,如果是这种情况,我的代码和测试看起来像:
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(),请参见上面的示例,了解如何使用。希望这会有所帮助吗?