gpt4 book ai didi

java - 使用 JMockit 模拟和验证 SLF4J

转载 作者:搜寻专家 更新时间:2023-11-01 02:03:08 30 4
gpt4 key购买 nike

我有一个带有 SLF4J 记录器实例的类:

 public class MyClass {

private static final Logger log = LoggerFactory.getLogger(MyClass.class);

public void foo() {
log.warn("My warn");
}
}

我需要像这样用 JMockit 测试它:

 @Test
public void shouldLogWarn(@Mocked Logger log) throws Exception {
new Expectations() {{
log.warn(anyString);
}};
MyClass my = new MyClass();
my.foo();
}

经过大量搜索后我发现,我需要以某种方式使用 MockUp。但无法准确了解。

顺便说一句,我使用的是最新版本的 JMockit(1.29),您无法再为最终静态字段setField(log)

最佳答案

JMockit 有 @Capturing适用于这种情况的注释

Indicates a mock field or a mock parameter for which all classes extending/implementing the mocked type will also get mocked.

Future instances of a capturing mocked type (ie, instances created sometime later during the test) will become associated with the mock field/parameter. When recording or verifying expectations on the mock field/parameter, these associated instances are regarded as equivalent to the original mocked instance created for the mock field/parameter.

这意味着如果您使用 @Capturing 而不是 @Mocked 对其进行注释,则在测试运行期间创建的每个 Logger 都将被与您注释的相关联。所以以下工作:

 @Test
public void shouldLogWarn(@Capturing final Logger logger) throws Exception {
// This really ought to be a Verifications block instead
new Expectations() {{
logger.warn(anyString);
}};
MyClass my = new MyClass();
my.foo();
}

附带说明一下,如果您只想验证方法是否被调用,最好使用 Verifications相反,因为这就是它的目的。所以你的代码看起来像这样:

 @Test
public void shouldLogWarn(@Capturing final Logger logger) throws Exception {
MyClass my = new MyClass();
my.foo();
new Verifications() {{
logger.warn(anyString);
}};
}

或者,您可以在 LoggerLoggerFactory 上使用 @Mocked

在某些情况下,@Capturing 由于注释工作方式的复杂性而无法按预期工作。幸运的是,您也可以通过在 LoggerLoggerFactory 上使用 @Mocked 来获得相同的效果,如下所示:

 @Test
public void shouldLogWarn(@Mocked final LoggerFactory loggerFactory, @Mocked final Logger logger) throws Exception {
MyClass my = new MyClass();
my.foo();
new Verifications() {{
logger.warn(anyString);
}};
}

注意: JMockit 1.34 到 1.38 has a bug这会阻止它与 slf4j-log4j12 以及可能的 SLF4J 的其他依赖项一起使用。如果遇到此错误,请升级到 1.39 或更高版本。

关于java - 使用 JMockit 模拟和验证 SLF4J,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40660543/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com