知识卡片

切片测试按需加载上下文

专业/工作 · 519.e

内容

Spring 测试分三个层级,加载成本递增:单元测试完全不感知 Spring,用普通 JUnit/Mockito 测单个类,跑得最快;@SpringBootTest 会拉起完整的应用上下文(可以选择带不带真实跑起来的内嵌服务器),最贴近真实运行环境但也最重;介于两者之间的是”切片测试”(如 @WebMvcTest 只加载 Spring MVC 相关的 bean、@JsonTest 只加载 JSON 序列化相关配置),只初始化被测功能真正需要的那一小块上下文,切片外的协作对象(比如 Controller 依赖的 Service)用 @MockBean 替换掉——这个 mock 会被直接注册进 Spring 上下文,容器自动装配的就是这个假对象。发散:这条”按需加载”的分级思路本质是把测试粒度和上下文加载成本对齐——没必要为了测一个 JSON 序列化逻辑,付出启动整个 Web 服务器和数据库连接池的代价,测试金字塔底层要快,顶层才需要真实环境。

参考来源

《Cloud Native Spring in Action》第3章《Getting started with cloud native development》