SpringBoot单元测试

测试均通过 SpringBoot3.5.0、JDK版本21。

简介

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

  1. Service测试: no01servicetest

  2. Controller测试: no02ControllerTest

  3. Controller对Service打桩&Service对Mapper打桩的测试: no03MockitoService

  4. 对文件上传下载的测试: no04FileUploadDownload

  5. 使用H2数据库对数据写入进行实际测试: no05H2DBTest

在 no03MockitoService 其实已经包含了该测试内容

  1. 测试Controller 对 Cookie 、 Session 、 Header 的读写: no06CookieSessionHeaderTest

  2. 使用嵌入式redis服务器(embedded-redis)对Redis进行测试: no07RedisTest

这种场景只有使用完整的spring容器方式进行单元测试能进行测试, 其他两种(完全脱离spring和部分启动的方式只能对redisTemplate进行打桩测试)

  1. 测试SrpingBoot的Filter: no08SpringFilterTest

  2. 演示controller使用thymeleaf模板而不是返回json时的单元测试: no09ThymeleafTest

  3. 异步调用测试: no10AsyncTest

  4. Service超时测试: no11TimeoutTest

  5. 普通的类中(不是spring bean) 静态方法和非静态方法的打桩测试:no12NoSpringBeanMethodMockTest