SpringBoot单元测试
简介
1. 完全脱离上下文(纯单元测试)
-
实现方式:
Mockito+JUnit5(无Spring注解) -
特点:
-
仅测试类自身逻辑
-
执行速度最快(毫秒级)
-
-
适用场景:Service工具类、纯POJO逻辑测试
-
代码示例:
@ExtendWith(MockitoExtension.class)
class GoodsControllerTest {
private MockMvc mockMvc;
// 需要模拟的控制器
@InjectMocks // 可以注入要模拟的类
private GoodsController goodsController;
// 需要打桩的Service
@Mock
GoodsService goodsService;
@BeforeEach
public void initOne() {
// 通过goodsController构建mvc模拟对象
mockMvc = MockMvcBuilders.standaloneSetup(goodsController).build();
}
}
2. 部分加载上下文(切片测试)
-
实现方式:
@WebMvcTest/@DataJpaTest等 -
特点:
-
仅加载相关模块组件(如MVC层/JPA层)
-
启动较快(秒级)
-
-
适用场景:控制器测试、Repository接口测试
-
代码示例:
@WebMvcTest(HomeController.class) // HomeController要测试那个控制器
class GoodsControllerTest {
@Autowired
private MockMvc mockMvc;
// 需要打桩的Service
@MockitoBean
GoodsService goodsService;
}
3. 完全加载上下文(集成测试)
-
实现方式:
@SpringBootTest -
特点:
-
加载完整Spring容器
-
支持真实数据库交互
-
启动慢(10秒+)
-
-
适用场景:端到端测试、多组件协同测试
-
代码示例:
@AutoConfigureMockMvc
@SpringBootTest
class GoodsControllerTest {
@Autowired
private MockMvc mockMvc;
// 需要模拟的控制器
@InjectMocks // 可以注入要模拟的类
private GoodsController goodsController;
// 需要打桩的Service
@MockitoBean
GoodsService goodsService;
}
测试用例
测试用例项目源代码: https://gitee.com/azhw/rookiedev-example/tree/master/编程/编程语言/Java/最佳实践/unittest/SpringBoot3UnitTest
-
Service测试: no01servicetest
-
Controller测试: no02ControllerTest
-
Controller对Service打桩&Service对Mapper打桩的测试: no03MockitoService
-
对文件上传下载的测试: no04FileUploadDownload
-
使用H2数据库对数据写入进行实际测试: no05H2DBTest
在 no03MockitoService 其实已经包含了该测试内容
-
测试Controller 对 Cookie 、 Session 、 Header 的读写: no06CookieSessionHeaderTest
-
使用嵌入式redis服务器(embedded-redis)对Redis进行测试: no07RedisTest
这种场景只有使用完整的spring容器方式进行单元测试能进行测试, 其他两种(完全脱离spring和部分启动的方式只能对redisTemplate进行打桩测试)
-
测试SrpingBoot的Filter: no08SpringFilterTest
-
演示controller使用thymeleaf模板而不是返回json时的单元测试: no09ThymeleafTest
-
异步调用测试: no10AsyncTest
-
Service超时测试: no11TimeoutTest
-
普通的类中(不是spring bean) 静态方法和非静态方法的打桩测试:no12NoSpringBeanMethodMockTest