java - 如何使用 JMockIt 对 Log4j 进行单元测试?

标签 java unit-testing logging log4j jmockit

当使用静态方法在类中声明 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/

相关文章:

java - servlet 到 mysql jdbc 连接类未找到异常

angular - 使用 Karma Angular 进行快照测试而不是开玩笑

swift - 如果 XCTestExpectation 出乎意料怎么办

子类中的 Java Logger

c# - C# 中的日志文件锁定问题

java - 将 .class 文件转换为 .java 文件

java - getHeight() 和 getWidth() 返回 0 用于绘制半圆

java - 我应该对从父类(super class)继承的方法进行单元测试吗?

python - expectedFailure 被计为错误而不是已通过

Java 线程在记录器上被阻止