Spring 测试模块为开发者提供了一套强大的工具,用于在 Spring 应用中进行单元测试、集成测试和端到端测试。
1. 测试框架集成
Spring 测试模块与多个测试框架集成,最常用的是 JUnit 5 和 TestNG。
JUnit 5 集成
- 使用
@ExtendWith(SpringExtension.class)
注解来启用 Spring 测试上下文。 - 使用
@SpringBootTest
注解进行集成测试。
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class MyApplicationTests {
@Test
void contextLoads() {
}
}
TestNG 集成
- 使用
@ContextConfiguration
注解配置 Spring 测试上下文。
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.springframework.test.context.ContextConfiguration;
import org.testng.annotations.Test;
@ContextConfiguration(classes = MyAppConfig.class)
public class MyApplicationTests extends AbstractTestNGSpringContextTests {
@Test
public void contextLoads() {
}
}
2. MockMvc
MockMvc 是用于测试 Spring MVC 控制器的工具,不需要启动真实的 Web 服务器。
- 模拟 HTTP 请求。
- 验证响应状态、内容、头信息等。
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
@WebMvcTest(MyController.class)
public class MyControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void shouldReturnDefaultMessage() throws Exception {
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(content().string("Hello, World"));
}
}
3. Spring TestContext Framework
Spring TestContext Framework 提供了一种在测试中加载 Spring 应用上下文的方式,支持注入和配置管理。
@ContextConfiguration
:指定配置类或 XML 配置文件。@WebAppConfiguration
:指定 Web 应用上下文。@ActiveProfiles
:指定活动配置文件(profiles)。
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = MyAppConfig.class)
public class MyApplicationTests {
@Test
void contextLoads() {
}
}
4. 数据库测试支持
Spring 提供了一些工具和注解来简化数据库相关的测试。
@DataJpaTest
:配置用于测试 JPA 相关的组件。@JdbcTest
:配置用于测试 JDBC 相关的组件。@Sql
和@SqlGroup
:在测试方法执行之前或之后运行 SQL 脚本。
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@DataJpaTest
public class MyRepositoryTests {
@Autowired
private MyRepository myRepository;
@Test
void testFindById() {
// 测试 JPA 仓库方法
}
}
5. Mock 对象支持
Spring 测试模块支持使用 Mockito 和其他 mock 框架来创建和注入 mock 对象。
@MockBean
:创建和注入一个 mock bean。@SpyBean
:创建和注入一个 spy bean。
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class MyServiceTests {
@MockBean
private MyRepository myRepository;
@Autowired
private MyService myService;
@Test
void testServiceMethod() {
// 使用 mockRepository 测试 service 方法
}
}
6. 测试事务管理
Spring 测试模块支持测试方法的事务管理,使用 @Transactional
注解可以确保测试方法在事务中执行,并在方法结束时回滚事务。
import org.junit.jupiter.api.Test;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@Transactional
public class MyServiceTests {
@Autowired
private MyService myService;
@Test
void testTransactionalMethod() {
// 测试方法将在事务中执行,并在结束时回滚
}
}
7. 其他功能
- 条件测试:使用
@EnabledIf
和@DisabledIf
注解来基于条件启用或禁用测试。 - 日志捕获:使用
@LogCapture
注解捕获测试中的日志输出。 - 测试 RestTemplate:使用
MockRestServiceServer
模拟和测试RestTemplate
请求。