Cucumber中用@MockBean模拟ProductService出现空指针异常求助
解决Cucumber测试Spring Boot Controller时MockBean为Null的问题
问题分析
你遇到的NullPointerException是因为Cucumber的Spring上下文初始化逻辑与Steps类上的重复注解冲突,导致@MockBean标注的ProductService没有被正确注入。
Cucumber通过@CucumberContextConfiguration注解识别Spring上下文的配置类,你的ProductControllerSteps上同时添加了@SpringBootTest和@AutoConfigureMockMvc,这会干扰Cucumber的上下文加载流程,使得Steps类没有被Spring容器正确管理,最终导致service对象为null。
解决方案
1. 清理Steps类的重复注解,让Spring管理Steps类
移除ProductControllerSteps上的@SpringBootTest和@AutoConfigureMockMvc,添加@Component注解,确保该类被Spring容器扫描并管理:
@Component public class ProductControllerSteps { long productId; Product product; @Autowired MockMvc mockMvc; @MockBean ProductService service; private ResultActions result; @Given("user has a valid product id") public void user_has_a_valid_product_id() { productId = 1L; product = new Product(); product.setId(productId); Mockito.when(service.getProductById(productId)).thenReturn(product); } @When("user makes GET request") public void user_makes_get_request() throws Exception { result = mockMvc.perform(MockMvcRequestBuilders.get("/api/products/"+productId) .accept(MediaType.APPLICATION_JSON_VALUE)) .andDo(print()); } @Then("system returns product data") public void system_returns_product_data() throws Exception { result.andExpect(status().is2xxSuccessful()); } }
2. 简化Spring上下文配置类
@SpringBootTest默认会自动加载标注@SpringBootApplication的主类(即你的ShopApiApplication),因此可以简化SpringGlue类的配置:
@CucumberContextConfiguration @SpringBootTest @AutoConfigureMockMvc public class SpringGlue{ }
3. 额外检查项
- 包结构:确保
ProductControllerSteps和SpringGlue在同一个包或主类的子包下,保证Spring能扫描到Steps类。 - 依赖版本兼容性:确认Cucumber与Spring Boot版本匹配(例如Cucumber 7.x对应Spring Boot 2.7+ / 3.x),版本不兼容会导致上下文初始化失败。
- Mockito依赖:确保项目中包含
spring-boot-starter-test依赖,它已经集成了Mockito所需的组件。
验证
修改完成后重新运行Cucumber测试,此时ProductService会被正确模拟注入,不会再出现NullPointerException。
内容的提问来源于stack exchange,提问作者wojmaj22
相关产品推荐
相关产品推荐

