我需要模拟一个记录器类,在这个类上被测试的类调用一个静态方法来获得一个对象。因此,我创建了这个静态函数的假实现,如官方教程中所描述的那样。我的假课是这样的
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,因为在假实现中,object @;似乎从未被初始化过。
然后,我尝试了以下更改:
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;
}};
...}当从测试类初始化假实现类时,它不会从未初始化的记录器对象中产生空指针异常。
我的结论是@ would记录器;只在测试类中自动初始化,而不是在假类中初始化。但是根据官方教程,@Mocked对象应该总是自动初始化。
我在这里错过了什么?
发布于 2022-02-26 08:07:25
当JMockit运行时,带有@Tested或@Tested注解的变量应该是非空的。实际上,JMockit正在为每个用户创建一个MockImpl。忽略了你的文章的复杂性,我主要关注的是你的@Mocked是空的,这让我强烈怀疑你没有使用JMockit运行。记住,为了正确运行,您必须拥有"-javaagent“之类的东西。没有它,那些@Mocked就不能工作,并且变量将为null。我猜这就是发生的事。
https://stackoverflow.com/questions/69723633
复制相似问题