首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jMockit:@模拟模拟对象不是在非测试类中初始化的。

jMockit:@模拟模拟对象不是在非测试类中初始化的。
EN

Stack Overflow用户
提问于 2021-10-26 13:03:02
回答 1查看 228关注 0票数 0

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

代码语言:javascript
复制
public class FakeLogger extends MockUp<Logger> {
  @Mocked Logger logger;
  @Mock 
  public Logger getLogger() {
      return logger;
  }
}

它在测试类中使用:

代码语言:javascript
复制
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 @;似乎从未被初始化过。

然后,我尝试了以下更改:

代码语言:javascript
复制
public class FakeLogger extends MockUp<Logger> {
    @Mocked Logger logger;
    public FakeLogger(Logger l) {
        logger=l;
    }
    @Mock 
    public Logger getRootLogger() {
        return logger;
    }
}

在测试类初始化假实现时:

代码语言:javascript
复制
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对象应该总是自动初始化。

我在这里错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2022-02-26 08:07:25

当JMockit运行时,带有@Tested或@Tested注解的变量应该是非空的。实际上,JMockit正在为每个用户创建一个MockImpl。忽略了你的文章的复杂性,我主要关注的是你的@Mocked是空的,这让我强烈怀疑你没有使用JMockit运行。记住,为了正确运行,您必须拥有"-javaagent“之类的东西。没有它,那些@Mocked就不能工作,并且变量将为null。我猜这就是发生的事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69723633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档