在 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
会自动创建一个实例。)
我正在尝试使用 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
会自动创建一个实例。)