【发布时间】:2017-04-12 14:24:18
【问题描述】:
我有以下代码:
@Component
@Slf4j
public class MyClass {
private OtherClass otherClass;
@Autowired
public MyClass(OtherClass otherClass) {
this.otherClass = otherClass;
}
public void start() {
try {
otherClass.execute();
} catch (FeatureException exception) {
log.warn(exception.getMessage());
}
}
我想进行测试以验证日志消息。 我不知道怎么做。
谢谢
【问题讨论】:
-
如果您需要验证日志消息,那可能是代码异味。您能否详细说明为什么需要验证日志消息?
-
@AlastorMoody 存在几个需要特定消息的用例:客户端请求正确记录此特定消息,因为某些其他工具需要它;一位项目经理说我想要 100% 的代码覆盖率,包括日志语句等。
-
您可以创建一个包私有异常 (PPE) 来扩展您的 FeatureException 异常。此 PPE 有一个 logMessage() 方法,该方法构造您想要的消息,而无需向调用代码询问消息。此 PPE 为您提供所需的日志消息,并且在您的单元测试中,您可以检查是否引发了包私有异常。从公共调用者那里,他们仍然可以捕获 FeatureException。这能解决你的问题吗?如果可行,那么我可以将此评论转换为答案,以便您接受。如果没有,您可以在 logMessage 上使用 assertEquals。
-
@AlastorMoody 如果有人说“在这种情况下,我希望记录一个警告”,这是一个要求。像任何其他要求一样,它应该被测试。我不认为那是一种气味。
-
“在这种情况下,我希望记录一个警告”-> 这是一个公平的用例。但是 OP 说“在这种情况下,我希望使用此确切消息记录警告”-> 开发人员应该能够通过添加其他信息来调整消息字符串以使其操作更容易(如果需要)。