JUnit中setUp()初始化对象数组遇空指针异常,求排查问题
解决JUnit setUp方法中对象数组初始化导致的NullPointerException问题
嘿,这个问题我之前也踩过坑,咱们来一步步拆解问题所在:
你描述的场景很清晰——在@Before标注的setUp方法里初始化对象数组时,测试抛出了空指针异常,但直接在测试方法里初始化就运行正常。先看看你的代码:
class MainTest { Lord baratheons[]; Lord starks[]; //Setup & Teardown @Before static void setUp() throws Exception { Lord baratheons[] = new Lord[3]; baratheons[0] = new Lord... } }
这里有两个关键错误导致了NPE:
1. @Before方法不能是静态的
JUnit的@Before注解设计是在每个测试方法执行前,针对当前测试类的实例调用这个方法。静态方法属于类本身,不属于实例,所以JUnit根本不会去执行这个静态的setUp方法——你的初始化代码其实从来没跑过!
解决办法很简单:把static修饰符去掉,让setUp变成非静态的实例方法。
2. 局部变量遮蔽了类成员变量
在setUp方法里,你写了Lord baratheons[] = new Lord[3];,这相当于重新定义了一个局部变量baratheons,它和类顶部声明的成员变量baratheons完全是两个独立的变量。你在方法里初始化的只是这个局部变量,类成员变量依然是null,测试方法访问它的时候自然就抛出空指针异常了。
正确的做法是直接给类成员变量赋值,不要重新定义变量:
修正后的代码示例
class MainTest { Lord baratheons[]; Lord starks[]; // 去掉static,@Before方法必须是实例方法 @Before void setUp() throws Exception { // 直接给类成员变量赋值,不再重新定义局部变量 baratheons = new Lord[3]; baratheons[0] = new Lord(...); // 补全你的对象初始化逻辑 // 如果需要初始化starks数组,也在这里处理 starks = new Lord[2]; // 示例长度 } @Test void testBaratheonInitialization() { // 现在访问baratheons不会再NPE了 assertNotNull(baratheons); assertNotNull(baratheons[0]); // 你的测试逻辑 } }
这样修改后,每个测试方法执行前,JUnit都会调用setUp方法正确初始化类成员变量,测试时就不会再遇到空指针异常啦。
内容的提问来源于stack exchange,提问作者SwampCrawford
相关产品推荐
相关产品推荐

