在 log4j 2.9.0 中使用 JMockit 的问题

Problems using JMockit with log4j 2.9.0

我正在尝试使用 JMockit 来测试是否发生了特定的日志记录操作:

public class LogClass1 {

    public void doLog() {
        Logger logger = LogManager.getLogger(LogClass1.class);
        logger.info("This is a log message for {}", "arg1");
    }
}

public class LogClass1Test {

    @Mocked
    private Logger logger;

    @Tested
    private LogClass1 x;

    @Before
    public void setup() {
        x = new LogClass1();
    }

    @Test
    public void testDoLog() {
        new Expectations() {
            {
                logger.info("This is a log message for {}", "arg1");
            }
        };
        x.doLog();
    }

}

但这会导致 "missing 1 invocation to org.apache.logging.log4j.Logger#info" 错误。

我以前用 log4j 1.x 做过类似的模拟,但我没有遇到过这个问题。我想知道是否存在一些问题,因为 log4j 2.x 似乎有更多的 info() 方法重载。

我尝试在单元测试中将 "arg1" 更改为 (Object)"arg1" 以查看是否可以使其与签名匹配。这没有帮助。

关于如何让它工作有什么想法吗?

注意Logger是一个接口LogClass1通过LogManager.getLogger静态工厂方法获取它的一个实例。因此,很明显,它创建了一些 Logger 实现 class 的实例。并说 class 在测试中没有被嘲笑。

测试需要做的是模拟LogManager,所以它returns @Mocked Logger 实例。即在测试class.

中增加一个@Mocked LogManager字段

(此外,不需要 setup 方法,因为 @Tested 会自动创建一个实例。)