You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:00:03