这是我的代码片段。我想用 WakeupException 强制调用 catch block 。
public void run() {
try {
try {
while (true) {
LOGGER.logp(Level.INFO, CLASS_NAME, "run()", "Attempting to Poll");
ConsumerRecords<String, String> records = consumer.poll(10000);
if (records.count() == 0) {
LOGGER.logp(Level.INFO, CLASS_NAME, "run()", "No Response. Invalid Topic");
break;
}
else if(records.count()>0) {
LOGGER.logp(Level.INFO, CLASS_NAME, "run()", "Response Received");
}
}
}
} catch (WakeupException e) {
consumer.close();
}
}
这是我尝试过的:
@Test(expected = WakeupException.class)
public void failRun() throws WakeupException, IOException {
KafkaConsumerForTests consumerThread3;
consumerThread3 = Mockito.mock(KafkaConsumerForTests.class);
doThrow(new WakeupException()).when(consumerThread3).run();
//Mockito.when(consumerThread2.run()).thenThrow(new WakeupException());
consumerThread3.run();
}
我只想调用 WakeupException 以便获得该代码块的行覆盖率。我该怎么办。顺便说一句,这是一个无效的方法。我也愿意接受涉及 PowerMock 的建议。
最佳答案
看到代码后,我很确定我们要模拟的调用是consumer.poll(...)
。我不是使用 Kafka 的专家,所以对这里的所有内容都持保留态度。看到consumer
是被测类的一个属性,应该可以在被测类中注入(inject)一个mocked实例,并抛出我们需要的WakeupException
。我们创建了一个(额外的)consumer
模拟并模拟其 poll(...)
,而不是(或附加于您的决定)被测类 -方法在调用时抛出所需的 WakeupException
。我们没有模拟对 consumerThread3.run()
的调用,而是模拟对 consumer.poll(...)
的调用。
关于您的问题的评论:“我只想调用 WakeupException
以便我获得线路覆盖” - 这绝不应该成为编写测试的原因。测试应该测试行为。如果没有要测试的行为(这种情况很少见),请不要编写测试。
OP 编辑了问题并添加了一些附加信息。我非常有信心这篇文章的第一段可以回答这个问题。其他段落是在 OP 在 try
block 中添加相关代码之前编写的。它们是在更抽象的层次上编写的。有兴趣的读者可以阅读它们,但这不是理解答案所必需的。
お楽しみください! - 请尽情享受吧!
我们想验证 catch
block 的行为。在生产代码中,try
block 中的某些内容会抛出相应的 Exception
触发 catch
block 。因此,为了测试 catch
block ,我们应该在 try
block 中模拟一些东西来抛出所述 Exception
。
如果在 block 内模拟调用似乎是不可能的,那可能是因为代码不是以测试驱动的方式开发的。你看,Test-Driven Development 的好处是您本质上生成可测试的代码。如果我们遇到无法测试/难以测试的代码,我们有两个(或三个)选项:
保持原样,不要测试它。如果没有要测试的行为,这可能是一个有效的答案。
重写代码,使其可测试。根据您项目的结构,这可能需要 5 分钟到 2 周或更长时间。不知道代码库很难说
使用非常规工具。正常的模拟框架,如 Mockito有一定的局限性,例如for Mockito mocking of
static
orfinal
methods is not supported .其他工具,例如 PowerMock ,旨在消除这些限制。但请注意:PowerMock 在字节码级别运行。这意味着- 我们不一定要测试我们在生产中使用的字节码
- 这可以与其他工具结合使用,例如JaCoCo .
这些工具应该是您最后的手段,并且很少使用。
关于Java (JUnit 4.xx) 如何使用模拟工具强制调用 try block 中的 void 方法异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50917411/