【发布时间】:2019-01-16 11:38:39
【问题描述】:
我正在为 try catch 块编写测试,但我对如何测试 catch 块感到很困惑……尤其是它使用 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);
}
}
谁能帮我解决这个问题?
【问题讨论】:
-
请注意:您的更新增加了混乱。现在您的测试类将不再编译,并提示:在测试类中声明一个 LOGGER 实例对您的生产代码没有任何影响。从这个角度来看,如果可能的话,您可能应该重新访问minimal reproducible example 并相应地增强您的问题。或者让我知道我的答案中缺少什么/如果。
-
所以我不应该在测试中包含LOGGER,在原始方法中测试catch块,最好的方法是触发异常然后验证异常,对吗? @鬼猫
-
这取决于你想做什么。如果您只是检查“好”: addTextToQueue() 确实捕获了任何异常,那么不引发异常的测试就足够了。但是,如果您想确保将某些消息写入记录器,那么您需要获得对它的控制权。再说一遍:在您的测试用例中放置一个 LOGGER 实例不会在您的生产代码中做任何事情。
-
感谢您的建议,如果异常抛出,我会尝试寻找检查日志的方法
-
感谢您的快速回归!如前所述:关键是获得对记录器对象的控制权。您可能想阅读有关依赖注入的信息。真正的问题是:该 LOGGER 实例如何进入您的生产代码?当你明白这一点时,你可以看看你的选择。可能是你可以推入一个模拟的记录器,如果那不可能,是的,查看真实记录器的“输出”可以做到。 (但我建议避免这种情况,您希望将单元测试与任何“真实”事物(例如文件系统中的文件)隔离开来)
标签: java unit-testing spring-boot testing mockito