You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerMock与JUnit4时,初始化TargetClass为何property为null?

问题:使用PowerMock+JUnit4初始化TargetClass时property为何为null?

相关代码

Property类

public abstract class Property {
    public Property() {
        //some code
    }
}

ParentClass类

public abstract class ParentClass {
    @Getter
    protected Property property;

    public ParentClass(Property property) {
        this.property = property;
    }
}

TargetClass类(存在语法错误)

public class TargetClass extends ParentClass {
    // 错误:构造方法不能加class关键字
    public class TargetClass (Property property) {
        super(property);
    }
}

测试类TargetClassTest

@RunWith(PowerMockRunner.class)
@PrepareForTest({TargetClass.class, ParentClass.class, Property.class})

public class TargetClassTest {
    @Mock
    private Property property;
    @InjectMocks
    private TargetClass target;

    @Test
    public void start() {
        target = new TargetClass(property);
    }
}

依赖配置

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.9</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.9</version>
    <scope>compile</scope>
</dependency>

原因分析

  1. TargetClass构造方法语法错误:构造方法定义时多写了class关键字,这会导致编译失败,即使强行运行也无法正确生成构造方法,最终导致参数传递异常。
  2. @PrepareForTest滥用:这个注解是用来处理需要Mock静态方法、私有方法或构造方法的类,你这里只是正常实例化对象,不需要对这些类做特殊Mock准备,反而会干扰类的正常加载和实例化流程。
  3. 依赖scope配置错误:PowerMock是测试依赖,scope应该设为test,而不是compile,compile会将测试依赖打包到生产代码中,可能引发类加载冲突或初始化异常。
  4. @InjectMocks冗余:你手动通过new创建实例,@InjectMocks在这里完全没用,反而可能因为PowerMock尝试注入但失败,间接导致property为null。

解决方案

1. 修复TargetClass构造方法语法错误

public class TargetClass extends ParentClass {
    public TargetClass(Property property) {
        super(property);
    }
}

2. 简化测试类配置

移除不必要的@PrepareForTest和@InjectMocks,手动创建实例即可:

@RunWith(PowerMockRunner.class)
public class TargetClassTest {
    @Mock
    private Property property;
    private TargetClass target;

    @Test
    public void start() {
        target = new TargetClass(property);
        // 验证property不为null
        assertNotNull(target.getProperty());
    }
}

3. 修正依赖scope

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.9</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.9</version>
    <scope>test</scope>
</dependency>

内容的提问来源于stack exchange,提问作者PrintScreenSys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:05:18