Cucumber 中的模拟对象

Mocking object in Cucumber

提问人:wojmaj22 提问时间:11/16/2023 更新时间:11/16/2023 访问量:21

问:

我正在尝试使用 BDD 测试我的项目,因此我使用 Cucumber。问题是,当我想测试 ProductController 时,我无法正确模拟我的 ProductService,并且我得到 NullPointerException - 我的服务为 null。下面是我的步骤代码。

@SpringBootTest
@AutoConfigureMockMvc
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());
    }
    
}

正如我在黄瓜指南中看到的那样,我还为黄瓜配置创建了这样的类:

@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("features")
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty")
public class RunCucumberTest {
}

以及:

@CucumberContextConfiguration
@SpringBootTest
@AutoConfigureMockMvc
@ContextConfiguration(classes = ShopApiApplication.class)
public class SpringGlue{
}

我正在尝试用 mockito 模拟我的服务,但每种配置都不起作用并导致空指针异常,我不知道如何让它工作。

java spring-boot junit cucumber

评论


答:

1赞 M.P. Korstanje 11/16/2023 #1

注释的类用于使用 Springs Test Context Framework Manager 配置 Spring 应用程序上下文。这包括通过 .@CucumberContextConfigurationMockitoTestExecutionListener

声明模拟 bean 可以通过对类进行注释来完成。也可以通过向类中添加字段并注释这些字段来声明模拟。SpringGlue

@CucumberContextConfiguration
@SpringBootTest
@AutoConfigureMockMvc
@ContextConfiguration(classes = ShopApiApplication.class)
@MockBean(ProductService.class)
public class SpringGlue {
}

正因为如此,注释上的注释没有做任何事情。此类应如下所示:MockBeanProductControllerSteps

public class ProductControllerSteps {
    
    ...
    
    @Autowired
    MockMvc mockMvc;
    
    @Autowired
    ProductService service;

自动连线服务将是一个模拟服务,因此您可以正常使用。Mockito.when(...)

注意:如果您有多个功能,它们都将使用相同的上下文配置。如果需要多种配置,则需要多个具有不同胶水配置的流道。