使用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>
原因分析
- TargetClass构造方法语法错误:构造方法定义时多写了
class关键字,这会导致编译失败,即使强行运行也无法正确生成构造方法,最终导致参数传递异常。 - @PrepareForTest滥用:这个注解是用来处理需要Mock静态方法、私有方法或构造方法的类,你这里只是正常实例化对象,不需要对这些类做特殊Mock准备,反而会干扰类的正常加载和实例化流程。
- 依赖scope配置错误:PowerMock是测试依赖,scope应该设为
test,而不是compile,compile会将测试依赖打包到生产代码中,可能引发类加载冲突或初始化异常。 - @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
相关产品推荐
相关产品推荐

