gpt4 book ai didi

java - 使用 slif4j Log 的 try catch block 的 mockito 测试问题

转载 作者:行者123 更新时间:2023-11-28 20:21:50 25 4
gpt4 key购买 nike

我正在为 try catch block 编写测试,但我对如何测试 catch block 感到很困惑...尤其是它使用 slf4j 来记录错误。

这里的 addText 是同一个类的另一个方法。

public class TextQueue {
public void addTextToQueue(final Text text) {
try {
if (text != null) {
addText(text);
}
} catch (final JsonProcessingException e) {
LOGGER.error("Error adding text to the queue : {}", e);
}
}
}

这是我的测试用例

@RunWith(MockitoJUnitRunner.class)
public class TextQueueTest {
private org.slf4j.Logger LOGGER = LoggerFactory.getLogger(TextQueueTest.class);

private static final String MY_TEXT = "src/text.json";
private Text text;
private final ObjectMapper mapper = new JacksonConfig().dateAsStringObjectMapper();

@Mock
private TextQueue textQueue;

@Before
public void setUp() throws IOException {
text = mapper.readValue(new File(TextQueueTest.MY_TEXT), Text.class);

}

@Test
public void addTextToQueue() {
try{
textQueue = spy(textQueue);
textQueue.addTextToQueue(text);
}catch(final Exception e){
LOOGER.error("add text to queue threw an error" + e);
}
}

谁能帮我解决这个问题?

最佳答案

首先,您真的应该阅读有关 Mockito 的优秀教程,例如来自 vogella 的教程。 .你看,你只是把很多没有意义的东西放在一起。

喜欢:

@Mock
private TextQueue textQueue;

然后有

textQueue = spy(textQueue);

在你的测试用例中。你应该很清楚这一点。 spy 建立在被测类的真实实例上。如前所述,创建一个监视模拟的 spy :这没有意义。

然后:

}catch(final Exception e){
Logger.error("add text to queue threw an error" + e);

再说一遍,毫无意义。单元测试的整个想法是当出现问题时它们失败。当您的生产代码抛出意外异常时,您不会记录它们,只是让它们最终使您的测试用例失败。

回答实际问题:看起来您的生产代码正在使用特定的“常量”记录器实例。鉴于这种设计,检查生产代码的唯一方法是:

  • 使那个 LOGGER 成为模拟对象
  • 以某种方式将其注入(inject)生产代码类的实例 underTest
  • 触发该方法以在 underTest 上进行测试(并以某种方式强制该方法抛出异常)
  • 验证模拟的 LOGGER 看到了对 error() 的预期调用

我们不能给出更好的建议,因为你的代码输入不够,我们真的不知道你的生产类在做什么(例如:我们不知道 LOGGER 是什么,它来自哪里来自。如果它恰好是一个静态变量,那么很可能你无法使用 Mockito 来“控制”它)。

无论如何,您实际上可能需要 spy 概念。为了测试 addTextToQueue(),您需要一种方法来调用“真实的”addTextToQueue() 实现,但是调用 addTser() within 需要进行模拟(以便您可以控制该调用的作用)。

但如前所述:从真正开始研究 Mockito 的工作原理,而不是将在某种“试错”方法中毫无意义的东西放在一起。使用模拟进行正确的单元测试很复杂,您无法通过“反复试验”来学习。

关于java - 使用 slif4j Log 的 try catch block 的 mockito 测试问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54216285/

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