Spring Boot Test 的详细使用教程

news/2024/11/14 0:39:46/文章来源:https://www.cnblogs.com/gongchengship/p/18540901

Spring Boot Test 是 Spring Boot 提供的一个强大测试框架,用于帮助开发者简化和加速应用程序的单元测试和集成测试。下面是对 Spring Boot Test 各种测试类型和主要注解的详细教程。

1. Spring Boot Test 的基础概念

Spring Boot 提供了多种不同层次的测试工具,主要分为以下几类:

  • 单元测试:用于测试单个类的功能,通常会隔离外部依赖,使用 Mockito 等框架来模拟。
  • 集成测试:测试多个组件协同工作的情况,通常会启动部分或全部 Spring 上下文。
  • 端到端测试:测试完整的应用,包括数据库等所有依赖。

Spring Boot Test 框架的核心依赖是 spring-boot-starter-test,它包含了多种测试框架,如 JUnit、Mockito、AssertJ、Hamcrest 和 JSONassert 等。

2. Spring Boot Test 常用注解

2.1 @SpringBootTest

@SpringBootTest 是 Spring Boot 提供的核心注解,适用于大多数集成测试。它可以启动完整的 Spring 上下文,模拟一个真实的应用程序环境。

示例:

@SpringBootTest
public class MyApplicationTests {@Autowiredprivate SomeService someService;@Testpublic void testServiceMethod() {assertNotNull(someService);}
}

常用属性:

  • classes:指定要加载的应用上下文类,通常是主应用类。
  • webEnvironment:指定 Web 环境类型,可以是 NONEMOCKRANDOM_PORTDEFINED_PORT

例如,如果我们要在随机端口启动 Web 服务器:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class WebApplicationTests {// 测试代码
}

2.2 @MockBean 和 @SpyBean

@MockBean@SpyBean 是 Spring Boot 提供的两个注解,允许你在测试时模拟和监控 Bean 行为。@MockBean 可以模拟依赖,而 @SpyBean 则会部分使用真实对象。

示例:

@SpringBootTest
public class MyServiceTests {@MockBeanprivate SomeDependency someDependency;@Autowiredprivate SomeService someService;@Testpublic void testSomeMethod() {when(someDependency.someMethod()).thenReturn("mocked result");assertEquals("mocked result", someService.someMethod());}
}

2.3 @DataJpaTest

@DataJpaTest 是专门为 JPA 相关测试提供的注解。它会配置一个内存数据库(如 H2),并只加载与 JPA 相关的 Bean。

示例:

@DataJpaTest
public class UserRepositoryTests {@Autowiredprivate UserRepository userRepository;@Testpublic void testSaveAndFind() {User user = new User("testUser");userRepository.save(user);User foundUser = userRepository.findByUsername("testUser");assertEquals("testUser", foundUser.getUsername());}
}

2.4 @WebMvcTest

@WebMvcTest 用于测试 Web 层(通常是 Controller),不加载 Service 和 Repository 层。适合测试请求到 Controller 的映射和验证等。

示例:

@WebMvcTest(SomeController.class)
public class SomeControllerTests {@Autowiredprivate MockMvc mockMvc;@MockBeanprivate SomeService someService;@Testpublic void testGetMethod() throws Exception {when(someService.getSomeData()).thenReturn("mock data");mockMvc.perform(get("/some-endpoint")).andExpect(status().isOk()).andExpect(content().string("mock data"));}
}

2.5 @JsonTest

@JsonTest 用于测试 JSON 序列化和反序列化过程。它会加载 JSON 相关的 Bean,如 ObjectMapper

示例:

@JsonTest
public class JsonSerializationTests {@Autowiredprivate JacksonTester<MyObject> json;@Testpublic void testSerialize() throws IOException {MyObject myObject = new MyObject("value");assertThat(this.json.write(myObject)).isEqualToJson("expected.json");}
}

3. 测试中的 MockMVC 用法

MockMvc 是 Spring 提供的一个测试工具,用于模拟 HTTP 请求并验证响应。它可以搭配 @WebMvcTest 注解使用,也可以在 @SpringBootTest 环境下手动创建。

示例:

@SpringBootTest
@AutoConfigureMockMvc
public class WebApplicationTests {@Autowiredprivate MockMvc mockMvc;@Testpublic void testEndpoint() throws Exception {mockMvc.perform(get("/api/hello")).andExpect(status().isOk()).andExpect(content().string("Hello World"));}
}

4. 测试数据的准备和清理

在测试中,通常需要一些初始化数据,Spring Boot 提供了 @Sql 注解,可以在测试开始时运行 SQL 脚本,此外 @Transactional 注解可以在每次测试结束后自动回滚数据。

示例:

@SpringBootTest
@Transactional
@Sql(scripts = "/test-data.sql")
public class TransactionalTests {@Autowiredprivate UserRepository userRepository;@Testpublic void testFindUser() {User user = userRepository.findByUsername("testUser");assertNotNull(user);}
}

5. 测试配置的分离

如果需要为不同环境提供不同的测试配置,可以使用 @ActiveProfiles 注解,指定要加载的配置文件。

示例:

@SpringBootTest
@ActiveProfiles("test")
public class ProfileBasedTests {@Autowiredprivate SomeService someService;@Testpublic void testServiceMethod() {assertNotNull(someService);}
}

6. 测试 RestTemplate

如果你的应用依赖 RestTemplate 进行外部 API 调用,可以使用 MockRestServiceServer 模拟外部服务。

示例:

@SpringBootTest
public class RestTemplateTests {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate RestTemplateBuilder restTemplateBuilder;private MockRestServiceServer mockServer;@BeforeEachpublic void setup() {this.mockServer = MockRestServiceServer.createServer(restTemplate);}@Testpublic void testRestTemplate() {this.mockServer.expect(requestTo("/some-api")).andRespond(withSuccess("response", MediaType.APPLICATION_JSON));String response = restTemplate.getForObject("/some-api", String.class);assertEquals("response", response);}
}

7. 总结

以上介绍了 Spring Boot Test 的主要功能和用法,通常可以从以下几步开始:

  1. 单元测试:使用 @MockBeanMockito 等工具模拟依赖。
  2. 集成测试:使用 @SpringBootTest 运行完整的应用上下文。
  3. Web 层测试:使用 @WebMvcTestMockMvc
  4. 数据库测试:使用 @DataJpaTest 测试 JPA 层。
  5. 配置分离:使用 @ActiveProfiles 指定不同环境配置。

掌握这些工具和注解后,可以覆盖 Spring Boot 应用的绝大部分功能测试需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832082.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx

WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx 1 WIN11 Chrome 双击打不开闪退 1.1 在 Windows 安全中心按照如下步骤操作1.2 右键对应的软件找到应用路径名称1.3 在程序设置按照如下图建立应用名称和后缀相同的命名,如 chrome.exe1.4 按照如下操作步骤打勾选项1…

LVM 使用与扩容总结

转载请注明出处:LVM(Logical Volume Manager,逻辑卷管理器)是一个用于Linux系统的磁盘管理工具。它提供了一种更加灵活的存储管理机制,可以方便地进行磁盘的扩容、缩减、快照以及迁移等操作。 基本概念物理卷(PV):物理磁盘或分区,如/dev/sda1。 卷组(VG):由一个或多…

针对搭建好的Self-Service-Password服务进行背景图片标题修改和去掉问答短信邮件功能选项的展示

官方链接https://ltb-project.org/documentation/index.html https://github.com/ltb-project/self-service-password关于安装我之前已经写了关于安装self-service-password相关的文章,具参考:https://www.cnblogs.com/autopwn/p/18208481修改背景先将要更改的背景图片上传上…

回归

回归时过境迁,上次发完博客后,之后的半年我努力学习,以106分的408分数极限通过了研究生考试初试,之后为了复试机试刷了ACWING,最终顺利通过了复试,被录取为硕士研究生。 进入新学校,技术上开始用java,springboot,mysql增删改查那一套;业务上一开始做开源仓的代码追溯…

开源 - Ideal库 -获取特殊时间扩展方法(四)

分享特殊时间获取的扩展方法,包括获取当前月第一个/最后一个指定星期几、上/下一个指定星期几、月份的第几周、年的第几周(ISO8601)、月份周数、是否周末、是否闰年、所在季度,提供详细代码和单元测试。书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法。01、获…

关于Windows外壳(Windows Shell)

在前面的文章中,我介绍过如何替换Windows Shell,将桌面替换为自己的程序。 但是这么做会有个问题,就是桌面环境未被初始化,即使创建了explorer.exe进程,桌面也不会出现。 这里搜集了一些关于WInlogon,LogonUI和Userinit的一些理论知识,有兴趣的小伙伴可以了解一下。Winlo…

如何修复 iPhone 无法通过 Quik App 的蓝牙连接来启动 GoPro Hero13 Black 的解决方案 All In One

如何修复 iPhone 无法通过 Quik App 的蓝牙连接来启动 GoPro Hero13 Black 的解决方案 All In One 最近再使用 GoPro Hero13 Black 的过程中发现 iPhone 经常无法通过 Quik App 的蓝牙唤起 GoPro 开机,需要手动删除 iPhone 的蓝牙匹配,并重新配对 GoPro, 非常麻烦和使用体验极…

VUE使用TS开发打包时发现校验问题无法打包

解决办法: 找到 tsconfig.app.json 这个文件,把他的include改为一个实际存在的空文件即可

企业博客在品牌建设中的作用

在数字营销时代,企业博客已成为品牌建设的重要工具。它不仅帮助企业与目标受众建立联系,还能够提升品牌形象、增强客户忠诚度,并推动销售。本文将探讨企业博客在品牌建设中的关键作用,并结合实际案例分析其效果。 一、建立品牌权威性 企业博客是展示行业知识和专业能力的平…

2024ICPC杭州赛后总结

首先,还是恭喜一下我们队第一次参赛就拿到了,非常的幸运赛前事情还得从网络赛说起,由于我们队网络赛的发挥实在不好,导致最后只得到了一场比赛机会,在选择赛站的时候,就非常的犹豫,我们知道等学长都选完之后,留下给我们的赛站就不多了,我们应该选一个比较有举办经验的…

vm安装ubuntu 20.04 server并用vscode进行ssh远程连接

最近写专业课作业需要用到vscode进行SSH连接ubuntu server,自己摸索了一会终于实现效果,秉承着“取之于网络,还之于网络”的开源精神写了一篇总结博客,欢迎大家参考,如有不足之处也欢迎大家指出。 文章参考: VS Code SSH远程连接Ubuntu_visual studio 连接到本地unbuntu远…