Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试

Spring Boot 测试详解


1. 测试依赖引入

Spring Boot 默认通过以下 Maven 依赖引入测试工具:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

该依赖包含 JUnit 5 、Mockito 、AssertJ 等核心测试库,支持单元测试、集成测试和 Mock 测试。


2. IDE 自动创建测试类

IDE(如 IntelliJ/Eclipse)会自动生成测试类,示例如下:

java 复制代码
@SpringBootTest
class Chapter15ApplicationTests {
    @Test
    void contextLoads() {
        // 验证应用上下文是否加载成功
    }
}
  • @SpringBootTest:加载完整的 Spring Boot 应用上下文。
  • @Test:JUnit 5 标注测试方法。

3. 测试注解详解
注解 作用
@SpringBootTest 加载完整的 Spring Boot 应用上下文,支持配置 webEnvironment 等参数。
@Test JUnit 5 标注测试方法。
@Autowired 从 Spring 容器中注入 Bean。
@MockBean 在测试上下文中模拟 Bean(Mockito)。
@WebMvcTest 仅加载 Web 层(Controller),不启动完整上下文。
@DataJpaTest 仅加载 JPA 相关配置,用于数据库测试。

4. 业务层测试

场景 :测试 UserService 的 getUser() 方法。

java 复制代码
@SpringBootTest
class UserServiceTests {
    @Autowired
    private UserService userService;

    @Test
    void testGetUser() {
        User user = userService.getUser(1L);
        Assertions.assertNotNull(user, "用户对象不能为空");
    }
}
  • 关键点 :
    • 通过 @Autowired 注入业务层 Bean。
    • 使用 Assertions(JUnit 5)或 Assert(JUnit 4)进行断言。

5. REST 风格测试

场景 :测试 REST 接口 /user/{id},使用随机端口避免冲突。

java 复制代码
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerTest {
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    void testGetUser() {
        User user = restTemplate.getForObject("/user/{id}", User.class, 1L);
        Assertions.assertNotNull(user, "用户对象不能为空");
    }
}
  • 关键点 :
    • webEnvironment = RANDOM_PORT:启动随机端口的嵌入式服务器。
    • TestRestTemplate:简化 REST 接口调用。

6. Mock 测试(Mockito)

场景 :模拟 ProductService 的 getProduct() 方法。

java 复制代码
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ProductClientTest {
    @MockBean
    private ProductService productService;

    @Test
    void testMockProduct() {
        Product mockProduct = new Product(1L, "产品名称", "产品描述");
        BDDMockito.given(productService.getProduct(1L))
                  .willReturn(mockProduct);
        Product result = productService.getProduct(1L);
        Assertions.assertNotNull(result, "产品对象不能为空");
    }
}
  • 关键点 :
    • @MockBean:在 Spring 上下文中替换真实 Bean 为 Mock。
    • given().willReturn():定义 Mock 方法的返回值。
    • Mockito 风格 :BDD 风格(given-when-then)或经典风格(when-thenReturn)。

7. 测试类型总结表
测试类型 适用场景 关键注解/工具
业务层测试 业务逻辑验证(Service 层) @SpringBootTest, @Autowired
REST 接口测试 控制器接口(Controller)测试 TestRestTemplate, RANDOM_PORT
Mock 测试 模拟外部依赖(如未实现的服务) @MockBean, Mockito
集成测试 跨层协作测试(如数据库) @DataJpaTest, @Transactional

8. 注意事项
  • Mockito 版本:Spring Boot 2.x 默认集成 Mockito 3.x,需注意语法差异。
  • 测试隔离:Mock 测试需确保模拟行为仅作用于当前测试方法。
  • 随机端口 :测试时需通过 LocalServerPort 注入实际端口(如需访问外部 URL)。

通过以上配置和示例,可覆盖 Spring Boot 应用的各类测试场景,提升代码质量和开发效率。

相关推荐
码事漫谈1 分钟前
五道题,测测你有没有真的入门 AI
后端
蜗牛互联网19 分钟前
Python + JSON Schema 实现工单结构化输出与本地复核
java·人工智能·后端
大侠归来2 小时前
Spring Boot 2.1 → 3.5 迁移推演:从实战出发的完整路线图
java·spring boot·后端
Sweet锦2 小时前
jDCS 开源项目:面向工业现场的 Modbus RTU 数据采集基础框架
java·spring boot·物联网·开源
海马2 小时前
Spring Boot 开发知识整理
java·spring boot·后端
谢亮_vipxieliang2 小时前
Spring Boot 3.x 从零开始——环境搭建与第一个 REST 项目
java·spring boot·后端
念何架构之路3 小时前
go-grpc核心抽象接口
开发语言·后端·golang
FYKJ_20103 小时前
django个性化新闻推荐35173-计算机课程设计、毕业设计
java·spring boot·后端·python·架构·django·课程设计
今年下半年3 小时前
【消息队列】Spring Boot 集成 Kafka 消息队列:确保消费完成(手动提交偏移量+幂等判断+失败重试机制)
spring boot·kafka·幂等·失败重试
计算机毕设定制辅导-无忧学长3 小时前
《校园食堂在线订餐小程序的设计与实现》
java·vue.js·spring boot·微信小程序·uniapp·校园食堂在线订餐小程序