Eclipse使用JUnit5时@BeforeEach未初始化对象 测试报空指针异常
问题根因
这个空指针和JUnit 5配置、@BeforeEach注解失效没有任何关系,纯粹是Java变量作用域书写错误:
- 测试类里定义的
Account account;是类成员变量,未手动赋值时默认值为null - 你在
setUp()方法里写的Account account = new Account();是在方法内部重新声明了一个和成员变量同名的局部变量,new出来的Account实例只赋值给了这个局部变量,方法执行结束后局部变量就会被回收,类层面的成员变量account自始至终都没被赋值,一直保持null - 你在setUp方法里打印
account.owner能正常输出结果,是因为那行代码读取的是方法内的局部变量,测试方法中调用的是从未赋值的null成员变量,自然会抛出空指针异常。
修复方法
把setUp()方法中变量前的类型声明Account删掉,直接给类成员变量赋值即可,修正后的setUp代码如下:
@BeforeEach void setUp() { // 去掉前面的Account类型声明,不要新建同名局部变量 account = new Account(); System.out.println("Hi" + account.owner); }
修改后每个测试方法执行前,都会正确初始化类成员变量account,空指针异常就会消失。
相关代码参考
原错误测试类核心片段
class AccountTest { Account account; // 类成员变量,默认值为null @BeforeEach void setUp() { // 错误点:声明了同名局部变量,没有给外部成员变量赋值 Account account = new Account(); System.out.println("Hi" + account.owner); // 此处读取局部变量,输出正常 } @Test void assertBeforeEachWorking() { System.out.println("Befroe each? "); System.out.println(account.owner); // 此处读取值为null的成员变量,抛出空指针 } }
Account类定义
package account; public class Account { int amount ; String owner = "default owner"; }
内容的提问来源于stack exchange,提问作者lingar
相关产品推荐
相关产品推荐

