我找到了解决方案,请参阅下面的我自己的答案。有人有更优雅的吗?
我想这样做以增加代码覆盖率并发现细微的错误。
假设要测试以下类:
public class Foo {
private final Logger logger = LoggerFactory.getLogger(Foo.class);
public void bar() {
String param=[..];
if(logger.isInfoEnabled()) logger.info("A message with parameter {}", param);
if(logger.isDebugEnabled()) {
// some complicated preparation for the debug message
logger.debug([the debug message]);
}
}
}
和以下测试类:
public class FooTest {
@Test
public void bar() {
Foo foo=new Foo();
foo.bar();
}
}
像 Cobertura 这样的代码覆盖工具将正确报告只有一些条件分支已被检查。
info 和 debug 为记录器激活或停用。
除了在您的覆盖范围内看起来很糟糕之外,这还带来了真正的风险。
如果 if(logger.isDebugEnabled()) 里面的代码有一些副作用怎么办?如果您的代码仅在启用 DEBUG 时才有效,并且在日志级别设置为 INFO 时惨遭失败怎么办?(这实际上发生在我们的一个项目中:p)
所以我的结论是,包含记录器语句的代码应始终在启用所有日志记录的情况下测试一次,并在禁用所有日志记录的情况下测试一次......
有没有办法用 JUnit 做类似的事情?我知道如何全局启用或禁用我在 Logback 中的所有日志记录,所以问题是:如何执行两次测试,一次启用日志记录,一次禁用日志记录。
ps 我知道这个问题,但我不认为这是重复的。我不太关心绝对覆盖率值,而是关心可能包含在 if(logger.isDebugEnabled()) 中的微妙、难以发现的错误。