Spring Boot集成测试中@ContextConfiguration和@SpringApplicationConfiguration之间的区别
即使同时使用@ContextConfiguration
和@SpringApplicationConfiguration
批注以及SpringJUnit4ClassRunner
来指定如何加载Spring应用程序上下文,它们之间也存在细微的差异。 尽管@ContextConfiguration
在加载应用程序上下文方面表现出色,但没有充分利用Spring Boot的功能 。 Spring Boot应用程序最终由SpringApplication(对于JAR而言)或SpringBootServletInitializer
加载。 此类不仅加载应用程序上下文,而且还允许记录和加载application.properties或application.yml文件中指定的外部属性以及Spring Boot框架未加载或启用的其他功能。
@ContextConfiguration
批注。
简而言之,最好使用@SpringApplicatoinConfiguration
批注而不是@ContextConfiguration
来编写针对Spring Boot应用程序的集成测试,包括针对网页或应用程序前端的测试。
现在您已经知道在编写Spring引导测试时@ContextConfiguration
和@SpringApplicationConfiguration
批注之间的本质区别,让我们了解一些代码示例的更多细节。
自从Spring 2.5引入SpringJUnit4ClassRunner
以来,Spring Framework就为编写集成测试提供了出色的支持,并且对于使用Spring Boot应用程序进行测试也是如此。 在集成测试期间,您还需要加载bean并将它们与依赖项连接起来。
当然,您可以手动执行此操作,但是最好由Spring为您处理,这样做会更好。 它还提供了开箱即用的功能,例如组件扫描,自动装配,声明事务管理,安全性和缓存,这些功能对于在更像生产环境中的测试非常方便。
Spring Boot-@ ContextConfiguration示例
这是一个简单的Spring集成测试,其中包含SpringJUnit4ClassRunner
和@ContextConfiguration
批注,这是用于加载应用程序上下文的基本Spring引导批注之一:
@RunWith (SpringJUnit4ClassRunner. class ) @ContextConfiguration (classes=BookConfiguration. class ) public class BookServiceTest { @Autowired private BookService bookService; @Test public void testBookService() { Book aBook = bookService.findByTitle( "Spring Boot in Action" ); assertEquals( "Craig Walls" , aBook.getAuthor()); assertEquals( 40 , aBook.getPrice()); } }
如您所见,BookServiceTest类使用@RunWith
JUnit注释和@ContextConfiguration注释进行注释。
@RunWith
批注是启用Spring集成测试所必需的,这就是我们SpringJUnit4ClassRunnner
传递SpringJUnit4ClassRunnner
类的原因,而@ContextConfiguration
批注指定了如何加载应用程序上下文。
在此示例中,将加载BookConfiguration
类中定义的Spring应用程序上下文。
SpringJUnit4ClassRunner
是一个功能强大的类,它不仅可以加载应用程序上下文,还可以将bean自动装配到测试中。
例如,在这个测试类中,我们需要一个BookService来测试其findByTitle()
方法,并且该bean是由SpringJUnit4ClassRunner
类自动注入的,因此我们只剩下编写代码
testBookService()方法。
现在,回到@ContextConfiguration
,即使它有助于加载应用程序上下文,它也不会启用日志记录或从application.properties 加载其他属性 ,例如server.port属性,在Spring启动时更改嵌入式tomcat服务器的端口是必需的应用。
要解决该问题,可以使用@SpringApplicaitonCongifguation
批注代替@ContextConfiguration
,如下所示:
@RunWith (SpringJUnit4ClassRunner. class ) @SpringApplicaitonCongifguation (classes=BookConfiguration. class ) public class BookServiceTest { @Autowired private BookService bookService; @Test public void testBookService() { Book aBook = bookService.findByTitle( "Cloud Native Java" ); assertEquals( "Josh Long" , aBook.getAuthor()); assertEquals( 40 , aBook.getPrice()); } }
这个行为与上一个示例相同,但是@SpringApplicationConfiguration
还将启用Spring引导日志记录并加载在application.properties或application.yml文件中定义的其他属性。
这就是Spring Boot中@ContextConfiguration
和@SpringApplicationConfiguration
批注之间的区别 。 即使与SpringJUnit4ClassRunner
一起使用并帮助加载应用程序上下文,后来的版本还是有用的,因为它还启用了日志记录和其他Spring Boot功能。
最好在为Spring Boot应用程序编写集成测试时使用@SpringApplicationConfiguration
,以使测试尽可能接近生产环境。
感谢您到目前为止阅读本文。 如果您喜欢我对@SpringApplicationConfiguration
和@ContextConfiguration
批注的解释,请与您的朋友和同事分享。 如果您有任何疑问或反馈,请留言。
翻译自: https://www.javacodegeeks.com/2019/02/difference-spring-boot-integration-test.html
Spring Boot集成测试中@ContextConfiguration和@SpringApplicationConfiguration之间的区别相关推荐
- 不要在 Spring Boot 集成测试中使用 @Transactional
在测试运行时,测试类中 @Transactional 注解,会导致测试中 Entity 数据的操作都是在内存中完成,最终并不会进行 commit 操作,也就是不会将 Entity 数据进行持久化操作, ...
- Spring Boot 架构中的国际化支持实践—— Spring Boot 全球化解决方案
背景 Spring Boot 主要通过 Maven 或 Gradle 这样的构建系统以继承方式添加依赖,同时继承了 Spring 框架中的优秀元素,减少了 Spring MVC 架构中的复杂配置,内置 ...
- 在Spring Boot测试中使用Testcontainer进行数据库集成测试
在此博客文章中,我想演示如何在Spring Boot测试中集成Testcontainer以便与数据库一起运行集成测试. 我没有使用Testcontainers的Spring Boot模块. 如何与他们 ...
- 在Spring Boot项目中使用Spock框架
转载:https://www.jianshu.com/p/f1e354d382cd Spock框架是基于Groovy语言的测试框架,Groovy与Java具备良好的互操作性,因此可以在Spring B ...
- scheduled每天下午1点执行一次_在Spring Boot项目中使用@Scheduled注解实现定时任务...
在java开发中定时任务的实现有多种方式,jdk有自己的定时任务实现方式,很多框架也有定时任务的实现方式.这里,我介绍一种很简单的实现方式,在Spring Boot项目中使用两个注解即可实现. 在sp ...
- Spring Boot开发中,经常听到的PO、VO、DAO、BO、DTO、POJO到底是什么?
在Spring Boot开发中,我们经常会听到诸如PO.VO.DAO.BO.DTO.POJO等概念.这些术语看起来很相似,但它们之间有着不同的含义和用途.在本文中,我们将详细介绍这些概念,并解释它们在 ...
- Guava Cache本地缓存在 Spring Boot应用中的实践
概述 在如今高并发的互联网应用中,缓存的地位举足轻重,对提升程序性能帮助不小.而 3.x开始的 Spring也引入了对 Cache的支持,那对于如今发展得如火如荼的 Spring Boot来说自然也是 ...
- spring boot 项目源码_Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent
前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent><groupId& ...
- Spring Boot 配置中的敏感信息如何保护?
在之前的系列教程中,我们已经介绍了非常多关于Spring Boot配置文件中的各种细节用法,比如:参数间的引用.随机数的应用.命令行参数的使用.多环境的配置管理等等. 这些配置相关的知识都是Sprin ...
最新文章
- web后门隐藏与检测思路
- linux xfs文件误删除恢复_linux系统文件误删除恢复
- JZOJ 5422. 【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜
- 指针数组的初始化和遍历,并且通过for循环方式、函数传参方式进行指针数组的遍历...
- 前端学习(1735):前端系列javascript之TypeScript介绍
- mysql subindex_mssql server sql分页存储过程
- c语言 python java_C语言、C++、Java,Python之间的区别,哪个更有前景,哪个更难 ?...
- amazeui学习笔记--css(布局相关2)--等分网格 AVG Grid
- python专题-读取xml文件
- 个性化新闻文章推荐的上下文Bandit方法
- 批量数据插入(Java读取Excel文件并使用mybatis写入MySQL数据库)(含免费源码下载)
- cpu win10 安装yolo_Win10 超详细 0基础 搭建YOLOV5教程【环境搭建篇】
- C++中的namespace(using namespace)的理解
- OpenCv —— 人脸识别(附完整源码)
- VUE项目开发的完整流程
- 百度Java后端实习面试
- 开发部程序员绩效考核办法
- 使用html2canvas保存html或者div内容为图片及自定义名称
- 微信小程序之身份证照片正反上传
- 有这两款手机拍照扫描软件,去哪都可以轻松使用