jMockit中非测试类@Mocked修饰的mock对象未初始化问题咨询
JMockit @Mocked注解作用范围问题解答
核心原因
你遗漏了@Mocked注解的作用范围规则:
JMockit 中@Mocked的自动初始化能力仅对两类字段生效:
- 包含
@Test方法的测试类本身的@Mocked成员字段 - 测试方法内声明的
Expectations、Verifications等JMockit内置匿名类的字段
你自定义的FakeLogger属于继承MockUp的独立实现类,不在JMockit的自动注入扫描范围内,因此类内部的@Mocked Logger logger不会被自动初始化,默认值为null,这是你第一次实现触发空指针的根本原因。
更简洁的实现方案
你不需要单独定义MockUp子类,直接在测试代码中Mock静态方法的返回值即可,示例如下:
public class MyTest { @Mocked Logger logger; @Test public void test() { new Expectations(Logger.class) {{ // Mock静态方法getLogger的返回值 Logger.getLogger(); result = logger; // 定义方法调用预期 logger.warn("message"); times = 1; }}; // 此处执行被测代码即可 } }
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

