junit - 带有 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
}
}
解决方案
您的示例缺少关于 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() 的地方,请参阅上面的示例以了解如何使用。希望这有帮助吗?
推荐阅读
- docker - Docker Desktop 版本 2.5.0.0 中断了已安装文件夹内卷的安装
- scala - 如何将表情符号替换为scala数据框中的空字符串?
- maven - 在 CI 中使用本地 Maven 存储库
- c# - 带有 MySql 的 EntityFrameworkCore 未创建所有表
- android - 如何从 Huawei AppGallery Connect 下载我的应用分析?
- javascript - 如何将一列添加到 1d json 数组并将其保存到文件中?
- amazon-sqs - 同一个 DLQ 可以同时用于 SNS 故障和 SQS 故障吗?
- security - 方法定义中的默认定义者权限
- installation - 如何在 InstallBuilder 中查找和检查多个文件?
- css - Angular:如何添加全局 CSS(例如添加到正文),但仅限于一个特定页面?