JUnit4单元测试使用@BeforeClass仍报NullPointerException如何解决?
问题根因
你抛出NullPointerException的直接原因是成员变量FlooringMasteryServiceLayer service未完成初始化,全程为null,执行service.createOrderFileNameFromDate(date)时触发空指针。你注释了构造方法中初始化service的逻辑,同时@Before、@BeforeClass方法中没有补充任何初始化代码,自然会出现该问题。
你提到的@BeforeClass未生效属于认知误区:当前你的@BeforeClass方法是空实现,本身没有任何初始化逻辑,自然不会产生预期效果;且@BeforeClass修饰的是静态方法,无法直接给非静态的service成员变量赋值。
可行解决方案
方案一:Spring整合JUnit4(推荐)
使用Spring提供的测试运行器自动完成上下文加载和Bean注入,无需手动编写初始化代码:
- 引入
spring-test依赖(若项目中未引入) - 修改测试类代码如下:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") public class FlooringMasteryServiceLayerImplTest { @Autowired private FlooringMasteryServiceLayer service; @BeforeClass public static void setUpClass() { } @AfterClass public static void tearDownClass() { } @Before public void setUp() { } @After public void tearDown() { } @Test public void testCreatedOrderFileNameFromDate() { LocalDate date = LocalDate.parse("2020-11-25"); String orderFileName = service.createOrderFileNameFromDate(date); assertEquals(orderFileName, "Orders_11252020.txt", "The order file name generated was incorrect."); } }
方案二:手动初始化
将你注释掉的初始化逻辑移到@Before方法中,保证每个测试方法执行前service都完成初始化:
public class FlooringMasteryServiceLayerImplTest { private FlooringMasteryServiceLayer service; @BeforeClass public static void setUpClass() { } @AfterClass public static void tearDownClass() { } @Before public void setUp() { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); service = ctx.getBean("serviceLayer", FlooringMasteryServiceLayer.class); } @After public void tearDown() { } @Test public void testCreatedOrderFileNameFromDate() { LocalDate date = LocalDate.parse("2020-11-25"); String orderFileName = service.createOrderFileNameFromDate(date); assertEquals(orderFileName, "Orders_11252020.txt", "The order file name generated was incorrect."); } }
内容的提问来源于stack exchange,提问作者Christian F.
相关产品推荐
相关产品推荐

