Spring Boot MockMvc测试用例出现java.lang.NullPointerException的原因
空指针异常原因分析及解决方案
核心原因
你的测试类仅添加了@AutoConfigureMockMvc注解,但缺少启动Spring测试上下文的必要注解,导致@Autowired注入的MockMvc和@MockBean标记的NewsletterService都未被初始化,调用它们的方法时触发空指针异常。
Spring的@AutoConfigureMockMvc仅负责配置MockMvc实例,但需要结合@SpringBootTest(启动完整上下文)或@WebMvcTest(仅启动Web层上下文)才能让Spring容器创建并注入相关Bean。
修正方案
方案1:使用@SpringBootTest(完整上下文测试)
给测试类添加@SpringBootTest注解,启动完整的Spring应用上下文,确保MockMvc和MockBean能被正确注入:
@SpringBootTest @AutoConfigureMockMvc public class NewsletterTest { @Autowired private MockMvc mockMvc; @MockBean private NewsletterService service; @Test public void deleteNewsletterShouldDelete() throws Exception { this.mockMvc.perform(MockMvcRequestBuilders .delete("/delete-newsletter/11") .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); verify(service, times(1)).deleteNewsletter(11L); } }
方案2:使用@WebMvcTest(轻量Web层测试)
如果只需要测试Web控制器逻辑,推荐使用@WebMvcTest,它只会加载与Web层相关的Bean,测试更高效:
@WebMvcTest(NewsletterController.class) public class NewsletterTest { @Autowired private MockMvc mockMvc; @MockBean private NewsletterService service; @Test public void deleteNewsletterShouldDelete() throws Exception { this.mockMvc.perform(MockMvcRequestBuilders .delete("/delete-newsletter/11") .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); verify(service, times(1)).deleteNewsletter(11L); } }
注:
@WebMvcTest默认已经自动配置了MockMvc,所以可以不用额外添加@AutoConfigureMockMvc。
内容的提问来源于stack exchange,提问作者Mark likes Quark
相关产品推荐
相关产品推荐

