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

Spring Boot JPA下JUnit+Mockito测试的类型判断与优化建议咨询

测试类型判断

你写的这个属于单元测试范畴:你使用MockMvc模拟HTTP请求,同时用Mockito mock了业务层shoppingListSvc的save方法,没有启动完整Spring容器,也没有对接真实数据库,仅针对Controller层的插入接口逻辑做测试,符合单元测试仅测试单一组件、外部依赖全部mock的特点。

现有代码存在的问题

  • 语法错误:list.getFruit().getFruitId缺少方法调用括号,list.getVegetable.getVegetableId同时缺少getVegetable和getVegetableId的方法调用括号,编译阶段就会报错
  • 无意义前置断言:你前三个断言是校验自己手动new出来的ShoppingList实体属性,只要实体构造方法没有问题,属性肯定符合预期,属于测试测试用例本身,对验证业务逻辑没有价值
  • 入参冗余:POST请求同时传递了param参数(fruitId、vegId)和JSON body,常规后端接口要么接收表单参数要么接收JSON body,同时传属于无效冗余入参,除非你的接口确实设计为同时接收两类参数
  • 变量名错误:定义的响应JSON变量是jsonOutput,后面断言用的是outputJson,变量名不匹配运行会直接报错
  • 缺少调用验证:仅mock了shoppingListSvc.save的返回结果,没有验证该方法是否被正确调用、调用参数是否符合预期,无法确认Controller是否正确触发了业务层逻辑

优化方案

优化后的代码如下:

@Test
public void testInsertionMethod() throws Exception {
    // 1. 准备测试数据
    final String INSERT_URI = "/insertionURL";
    ShoppingList testList = new ShoppingList(3, new Fruit(1), new Vegetable(1));
    String expectedJson = jsonConversionMethod(testList);

    // 2. Mock依赖方法
    Mockito.when(shoppingListSvc.save(Mockito.any(ShoppingList.class))).thenReturn(testList);

    // 3. 执行接口请求
    MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post(INSERT_URI)
                    .content(expectedJson)
                    .contentType(MediaType.APPLICATION_JSON)
                    .accept(MediaType.APPLICATION_JSON))
            .andReturn();

    // 4. 断言响应结果
    MockHttpServletResponse response = mvcResult.getResponse();
    String actualJson = response.getContentAsString();
    Assert.assertEquals(HttpStatus.OK.value(), response.getStatus());
    Assert.assertEquals(expectedJson, actualJson);

    // 5. 验证业务层调用
    Mockito.verify(shoppingListSvc, Mockito.times(1))
            .save(Mockito.argThat(list ->
                    list.getFruit().getFruitId() == 1 && list.getVegetable().getVegetableId() == 1
            ));
}

优化点说明:

  • 补全@Test测试注解,修正所有语法、变量名错误
  • 移除无意义的实体属性前置断言
  • 删除冗余param参数,仅保留接口实际接收的JSON body入参
  • 变量名语义化调整,用expected/actual区分预期值和实际返回值,提升可读性
  • 新增Mockito verify逻辑,验证业务层save方法被调用1次,且入参属性符合预期,确保Controller逻辑正确性
  • 调整断言顺序,先校验状态码再校验返回内容,更符合问题排查逻辑

内容的提问来源于stack exchange,提问作者CodeName

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:45:04