即使同时使用@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