我需要模拟一个记录器类,在这个类上被测试的类调用一个静态方法来获取一个对象。因此,我创建了一个官方教程中描述的静态函数的伪实现。我的假类是这样的
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不起作用,变量将为空。我猜这就是发生的事情。