我试图测试我的项目使用BDD,因此我使用黄瓜.问题是,当我想测试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{
}

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

推荐答案

@CucumberContextConfiguration标注的类用于使用Springs测试上下文框架管理器配置Spring应用程序上下文.这包括通过MockitoTestExecutionListener设置模拟.

声明模拟Bean可以通过SpringGlue类上的注释来完成.还可以通过向类中添加字段并对其进行注释来声明模拟.

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

正因为如此,ProductControllerSteps上的MockBean注释什么都不做.此类应如下所示:

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

自动连接服务将是一个模拟服务,所以你可以像往常一样使用Mockito.when(...).

注意:如果你有多个特性,它们都将使用相同的上下文配置.如果您需要多种配置,则需要多个流道,并使用不同的gulp 配置.

Java相关问答推荐

Java字符串常数池困惑

如何审查Java dtos中的自定义注释字段?

Listview—在Android Java中正确链接项目时出错

Java 8中的多个字段和计数

解析Javadoc时链接的全限定类名

如何判断一个矩阵是否为有框矩阵?

如何找到MongoDB文档并进行本地化?

SpringBoot+Java 17@Valid未验证POJO

如何正确创建序列图?

如何使用log4j2(Json)记录由";异常引起的所有";?

try 从REST API返回对象列表时出错

我怎样才能让IntelliJ标记toString()的任何实现?

如何用内置Java从JavaFX应用程序中生成.exe文件?

在Spring Boot应用程序中,server.port=0的默认端口范围是多少?

在Java中比较同一多维数组的两个不同的字符串元素

Java 21内置http客户端固定运营商线程

将基于实例编号的对象列表拆分为新的对象列表

ControlsFX RangeSlider在方向垂直时滞后

Java 21保护模式的穷尽性

java.exe如何执行java源代码?