gpt4 book ai didi

Java (JUnit 4.xx) 如何使用模拟工具强制调用 try block 中的 void 方法异常?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:08 24 4
gpt4 key购买 nike

这是我的代码片段。我想用 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 or final methods is not supported .其他工具,例如 PowerMock ,旨在消除这些限制。但请注意:PowerMock 在字节码级别运行。这意味着

    • 我们不一定要测试我们在生产中使用的字节码
    • 这可以与其他工具结合使用,例如JaCoCo .

    这些工具应该是您最后的手段,并且很少使用。

关于Java (JUnit 4.xx) 如何使用模拟工具强制调用 try block 中的 void 方法异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50917411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com