jMockit: @ mock对象没有在非测试类中初始化



我需要模拟一个记录器类,在这个类上被测试的类调用一个静态方法来获取一个对象。因此,我创建了一个官方教程中描述的静态函数的伪实现。我的假类是这样的

public class FakeLogger extends MockUp<Logger> {
@Mocked Logger logger;
@Mock 
public Logger getLogger() {
return logger;
}
}

在测试类中使用:

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,因为在伪实现中对象@ mock Logger Logger;似乎从未初始化过。

然后我尝试了以下更改:

public class FakeLogger extends MockUp<Logger> {
@Mocked Logger logger;
public FakeLogger(Logger l) {
logger=l;
}
@Mock 
public Logger getRootLogger() {
return logger;
}
}

测试类初始化伪实现:

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;
}};
...}

当使用@ mock Logger记录器初始化伪实现类时;对象,它可以工作,而不会产生来自未初始化的记录器对象的空指针异常。

我的结论是@ mock Logger Logger;只在测试类中自动初始化,而不在伪类中初始化。但是根据官方教程,@ mock对象应该总是自动初始化。

我在这里错过了什么?

当JMockit运行时,带有@Tested或@ mock注释的变量应该是非空的。实际上,JMockit正在为它们中的每一个创建一个MockImpl。忽略了你的帖子的许多复杂性,我主要关注的事实是你的@ mock日志是空的,这让我强烈怀疑你没有使用JMockit运行。请记住,为了正常运行,必须使用"-javaagent"的东西。没有它,那些@ mock不起作用,变量将为空。我猜这就是发生的事情。