繁体   English   中英

jMockit:@Mocked mock object 未在非测试 class 中初始化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM