我正在尝试使用 BDD 测试我的项目,因此我使用 Cucumber。问题是,当我想测试 ProductController 时,我无法正确模拟我的 ProductService,并且得到 NullPointerException - 我的服务为空。下面是我的步骤的代码。
@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来模拟我的服务,但是每种配置都不起作用并导致空指针异常,我不知道如何使其工作。
用
@CucumberContextConfiguration
注解的类用于使用 Springs Test Context Framework Manager 配置 Spring 应用程序上下文。这包括通过 MockitoTestExecutionListener
设置模拟。
可以通过在
SpringGlue
类上添加注释来声明模拟 bean。还可以通过向类添加字段并对其进行注释来声明模拟。
@CucumberContextConfiguration
@SpringBootTest
@AutoConfigureMockMvc
@ContextConfiguration(classes = ShopApiApplication.class)
@MockBean(ProductService.class)
public class SpringGlue {
}
因此
MockBean
上的 ProductControllerSteps
注释不会执行任何操作。这个类应该看起来像:
public class ProductControllerSteps {
...
@Autowired
MockMvc mockMvc;
@Autowired
ProductService service;
自动连线服务将是一个模拟服务,因此您可以正常使用
Mockito.when(...)
。
注意:如果您有多个功能,它们都将使用相同的上下文配置。如果您需要多种配置,则需要多个具有不同胶水配置的流道。