即使同时使用@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之间的区别相关推荐

  1. 不要在 Spring Boot 集成测试中使用 @Transactional

    在测试运行时,测试类中 @Transactional 注解,会导致测试中 Entity 数据的操作都是在内存中完成,最终并不会进行 commit 操作,也就是不会将 Entity 数据进行持久化操作, ...

  2. Spring Boot 架构中的国际化支持实践—— Spring Boot 全球化解决方案

    背景 Spring Boot 主要通过 Maven 或 Gradle 这样的构建系统以继承方式添加依赖,同时继承了 Spring 框架中的优秀元素,减少了 Spring MVC 架构中的复杂配置,内置 ...

  3. 在Spring Boot测试中使用Testcontainer进行数据库集成测试

    在此博客文章中,我想演示如何在Spring Boot测试中集成Testcontainer以便与数据库一起运行集成测试. 我没有使用Testcontainers的Spring Boot模块. 如何与他们 ...

  4. 在Spring Boot项目中使用Spock框架

    转载:https://www.jianshu.com/p/f1e354d382cd Spock框架是基于Groovy语言的测试框架,Groovy与Java具备良好的互操作性,因此可以在Spring B ...

  5. scheduled每天下午1点执行一次_在Spring Boot项目中使用@Scheduled注解实现定时任务...

    在java开发中定时任务的实现有多种方式,jdk有自己的定时任务实现方式,很多框架也有定时任务的实现方式.这里,我介绍一种很简单的实现方式,在Spring Boot项目中使用两个注解即可实现. 在sp ...

  6. Spring Boot开发中,经常听到的PO、VO、DAO、BO、DTO、POJO到底是什么?

    在Spring Boot开发中,我们经常会听到诸如PO.VO.DAO.BO.DTO.POJO等概念.这些术语看起来很相似,但它们之间有着不同的含义和用途.在本文中,我们将详细介绍这些概念,并解释它们在 ...

  7. Guava Cache本地缓存在 Spring Boot应用中的实践

    概述 在如今高并发的互联网应用中,缓存的地位举足轻重,对提升程序性能帮助不小.而 3.x开始的 Spring也引入了对 Cache的支持,那对于如今发展得如火如荼的 Spring Boot来说自然也是 ...

  8. spring boot 项目源码_Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent

    前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent><groupId& ...

  9. Spring Boot 配置中的敏感信息如何保护?

    在之前的系列教程中,我们已经介绍了非常多关于Spring Boot配置文件中的各种细节用法,比如:参数间的引用.随机数的应用.命令行参数的使用.多环境的配置管理等等. 这些配置相关的知识都是Sprin ...

最新文章

  1. web后门隐藏与检测思路
  2. linux xfs文件误删除恢复_linux系统文件误删除恢复
  3. JZOJ 5422. 【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜
  4. 指针数组的初始化和遍历,并且通过for循环方式、函数传参方式进行指针数组的遍历...
  5. 前端学习(1735):前端系列javascript之TypeScript介绍
  6. mysql subindex_mssql server sql分页存储过程
  7. c语言 python java_C语言、C++、Java,Python之间的区别,哪个更有前景,哪个更难 ?...
  8. amazeui学习笔记--css(布局相关2)--等分网格 AVG Grid
  9. python专题-读取xml文件
  10. 个性化新闻文章推荐的上下文Bandit方法
  11. 批量数据插入(Java读取Excel文件并使用mybatis写入MySQL数据库)(含免费源码下载)
  12. cpu win10 安装yolo_Win10 超详细 0基础 搭建YOLOV5教程【环境搭建篇】
  13. C++中的namespace(using namespace)的理解
  14. OpenCv —— 人脸识别(附完整源码)
  15. VUE项目开发的完整流程
  16. 百度Java后端实习面试
  17. 开发部程序员绩效考核办法
  18. 使用html2canvas保存html或者div内容为图片及自定义名称
  19. 微信小程序之身份证照片正反上传
  20. 有这两款手机拍照扫描软件,去哪都可以轻松使用

热门文章

  1. 各种模板(数学数论字符串)
  2. 纪中C组模拟赛总结(2019.9.7)
  3. codeforces gym-101741 Subsequence Sum Queries 分治+离线
  4. Mybatis简介与原理
  5. Oracle入门(十四.21)之创建DML触发器:第二部分
  6. Java数组,字符串
  7. 计划得一步一步实施,题库首先是第一步!
  8. SpringCloudStream
  9. 2018蓝桥杯省赛---java---C---8(等腰三角形)
  10. 2015蓝桥杯省赛---java---B---3(三羊献瑞)