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
相关产品推荐
相关产品推荐

