当使用静态方法在类中声明 Logger(或任何静态字段)时:
public class Foo {
private static final Logger LOGGER = Logger.getLogger(Foo.getClass);
}
断言调用其上的方法(用于审计)的正确方法是什么?
下面的会起作用,但是 setField 似乎是错误的方法,取消了 @Tested 注释的使用以允许自动注入(inject)。
@Mocked Logger logger
new Expectations() {
{
setField(unitUnderTest, logger);
}
}
JMockIt 似乎通过@UsingMocksAndStubs(Log4jMocks.class) 提供了一个解决方案,但是这不允许对其进行期望,因为它会导致调用 getLogger() 返回一个真实但无用的 Logger而不是模拟实例。
最佳答案
很简单:
@Test
public void verifyAuditing(@Cascading final Logger logging)
{
// Call code under test which will create auditing records.
new Verifications() {{ logging.info("expected audit info"); }};
}
@Cascading
的使用导致 Logger
在“级联”模式下被模拟,其中每个返回引用类型的方法都会自动创建一个模拟实例。初始模拟实例 logging
表示所有此类实例。
关于java - 如何使用 JMockIt 对 Log4j 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20515929/