试用期之单元测试实践

单元测试实践

maven包说明

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

具体使用

/**
 * @program: 
 * @author: ZhaoChen Li
 * @created: 2023/07/20 14:03
 */
@SpringBootTest(classes = ChatSetApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) // 防止端口被占用,采用随机端口
@ActiveProfiles("dev") // 激活 dev 配置文件
class CusFastMenuConfigControllerTest {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;
    private HttpHeaders headers;
    public static final String baseUrl = "/v6/menuConfig";

    private final Logger logger = LogManager.getLogger(CusFastMenuConfigControllerTest.class);
    ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 每一次test前都要初始化
     */
    @BeforeEach
    public void init(){
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
        MultiValueMap<String, String> headerMap = new LinkedMultiValueMap<>();
        //设置header详细信息
        headerMap.add("language", "zh");
        headerMap.add("temp-id", "123456");
        headers = new HttpHeaders();
        headers.addAll(headerMap);
    }

    @Test
    void findCusMenuConfigByKeyword() throws Exception {
        CusMenuConfigFindReqVo cusMenuConfigFindReqVo = new CusMenuConfigFindReqVo();
        cusMenuConfigFindReqVo.setMenuType("");
        cusMenuConfigFindReqVo.setMenuName("");
        cusMenuConfigFindReqVo.setCompanyId("");
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post(baseUrl + "/findCusMenuConfigByKeyword")
                //设置headers信息
                .headers(headers)
                //post方法请求体
                .content(objectMapper.writeValueAsString(cusMenuConfigFindReqVo))
                //请求的内容类型为 JSON 格式
                .contentType(MediaType.APPLICATION_JSON))
                //对响应体进行判断(响应状态码为200则不抛异常)
                .andExpect(MockMvcResultMatchers.status().isOk())
                //打印响应结果
                .andDo(MockMvcResultHandlers.print())
                //将json字符串转化为json对象,并获取指定参数值,是否与结果匹配('$'表示重根路径下进行查找)
                .andExpect(MockMvcResultMatchers.jsonPath("$.retMsg").value("成功"))
                .andReturn();
        //响应结果返回
        String contentAsString = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8);
        logger.info(contentAsString);
    }
}

参数化测试

  • 需要自定义一个参数提供器继承ArgumentsProvider接口
// 自定义参数提供器
static class CustomObjectProvider implements ArgumentsProvider {
    @Override
    public Stream<? extends Arguments> provideArguments(org.junit.jupiter.api.extension.ExtensionContext context) {
        // 在这里生成要传递给测试方法的对象参数
        // 这里简单示范,生成两个对象作为参数
        return Stream.of(
            Arguments.of(new CusMenuConfigFindReqVo()),
            Arguments.of(new CusMenuConfigFindReqVo())
        );
    }
}

@ParameterizedTest // 参数化测试注解
@ArgumentsSource(CustomObjectProvider.class) // 使用自定义参数提供器
void findCusMenuConfigByKeyword(CusMenuConfigFindReqVo cusMenuConfigFindReqVo) throws Exception {
    MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post(baseUrl + "/findCusMenuConfigByKeyword")
                                          //设置headers信息
                                          .headers(headers)
                                          //post方法请求体
                                          .content(objectMapper.writeValueAsString(cusMenuConfigFindReqVo))
                                          //请求的内容类型为 JSON 格式
                                          .contentType(MediaType.APPLICATION_JSON))
        //对响应体进行判断(响应状态码为200则不抛异常)
        .andExpect(MockMvcResultMatchers.status().isOk())
        //打印响应结果
        .andDo(MockMvcResultHandlers.print())
        //将json字符串转化为json对象,并获取指定参数值,是否与结果匹配
        .andExpect(MockMvcResultMatchers.jsonPath("$.retMsg").value("成功"))
        .andReturn();
    //响应结果返回
    String contentAsString = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8);
    logger.info(contentAsString);
}
  • 结果展示:

在这里插入图片描述

问题思考:

  • 测试某一个controller的接口时出现了多个controller的结果,为什么某一个controller的class会有两个?

在这里插入图片描述

  • 问题找到了因为将测试类和controller类都放到了同一个包下,@Slf4j都给覆盖了,这是因为@Slf4j是Lombok库提供的注解,在编译时会生成一个名为log的日志对象。
  • 解决方案:在Code Coverage中添加需要扫描的包
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值