[英]jMockit: @Mocked mock object is not initialized in a non-test class
我需要模拟一个记录器 class,在该记录器上,被测类调用 static 方法来获取 object。因此,我创建了 static function 的伪实现,如官方教程中所述。 我的假 class 看起来像这样
public class FakeLogger extends MockUp<Logger> {
@Mocked Logger logger;
@Mock
public Logger getLogger() {
return logger;
}
}
用于测试class:
public class MyTest {
@Mocked Logger logger;
@Before
public void setUp() throws Exception {
new FakeLogger();
}
@Test
public void test() {
new Expectations() {{
logger.warn("message");
times = 1;
}};
/*here classes under test are executed which obtain use the logger by Logger.getLogger().log("message");*/}
此实现不起作用。 问题是 Logger.getLogger() 返回 null 因为在伪造的实现中 object @Mocked Logger 记录器; 似乎从未被初始化。
然后我尝试了以下更改:
public class FakeLogger extends MockUp<Logger> {
@Mocked Logger logger;
public FakeLogger(Logger l) {
logger=l;
}
@Mock
public Logger getRootLogger() {
return logger;
}
}
通过测试 class 初始化假实现:
public class MyTest {
@Mocked Logger logger;
@Before
public void setUp() throws Exception {
new FakeLogger(logger);
}
@Test
public void test() {
new Expectations() {{
logger.warn("message");
times = 1;
}};
...}
使用@Mocked Logger 记录器初始化伪实现 class 时; object 来自测试 class 它在没有来自未初始化记录器 object 的 null 指针异常的情况下工作。
我的结论是@Mocked Logger 记录器; 仅在测试 class 中自动初始化,而在假 class 中不自动初始化。但根据官方教程@Mocked object 应始终自动初始化。
我在这里错过了什么?
当 JMockit 运行时,用@Tested 或@Mocked 注释的变量应该是非空的。 实际上,JMockit 正在为它们中的每一个创建一个 MockImpl。 忽略你帖子的很多复杂性,我主要关注你的@Mocked 记录器是 null 的事实,这让我强烈怀疑你没有使用 JMockit 运行。 请记住,为了正常运行,您必须拥有“-javaagent”的东西。 没有它,那些@Mocked 将不起作用,变量将为 null。我猜这就是正在发生的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.