javascript
Spring Boot集成测试中@ContextConfiguration和@SpringApplicationConfiguration之间的区别
即使同時使用@ContextConfiguration和@SpringApplicationConfiguration批注以及SpringJUnit4ClassRunner來指定如何加載Spring應(yīng)用程序上下文,它們之間也存在細微的差異。 盡管@ContextConfiguration在加載應(yīng)用程序上下文方面表現(xiàn)出色,但沒有充分利用Spring Boot的功能 。 Spring Boot應(yīng)用程序最終由SpringApplication(對于JAR而言)或SpringBootServletInitializer加載。 此類不僅加載應(yīng)用程序上下文,而且還允許記錄和加載application.properties或application.yml文件中指定的外部屬性以及Spring Boot框架未加載或啟用的其他功能。
@ContextConfiguration批注。
簡而言之,最好使用@SpringApplicatoinConfiguration批注而不是@ContextConfiguration來編寫針對Spring Boot應(yīng)用程序的集成測試,包括針對網(wǎng)頁或應(yīng)用程序前端的測試。
現(xiàn)在您已經(jīng)知道在編寫Spring引導(dǎo)測試時@ContextConfiguration和@SpringApplicationConfiguration批注之間的本質(zhì)區(qū)別,讓我們了解一些代碼示例的更多細節(jié)。
自從Spring 2.5引入SpringJUnit4ClassRunner以來,Spring Framework就為編寫集成測試提供了出色的支持,并且對于使用Spring Boot應(yīng)用程序進行測試也是如此。 在集成測試期間,您還需要加載bean并將它們與依賴項連接起來。
當(dāng)然,您可以手動執(zhí)行此操作,但是最好由Spring為您處理,這樣做會更好。 它還提供了開箱即用的功能,例如組件掃描,自動裝配,聲明事務(wù)管理,安全性和緩存,這些功能對于在更像生產(chǎn)環(huán)境中的測試非常方便。
Spring Boot-@ ContextConfiguration示例
這是一個簡單的Spring集成測試,其中包含SpringJUnit4ClassRunner和@ContextConfiguration批注,這是用于加載應(yīng)用程序上下文的基本Spring引導(dǎo)批注之一:
@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批注指定了如何加載應(yīng)用程序上下文。
在此示例中,將加載BookConfiguration類中定義的Spring應(yīng)用程序上下文。
SpringJUnit4ClassRunner是一個功能強大的類,它不僅可以加載應(yīng)用程序上下文,還可以將bean自動裝配到測試中。
例如,在這個測試類中,我們需要一個BookService來測試其findByTitle()方法,并且該bean是由SpringJUnit4ClassRunner類自動注入的,因此我們只剩下編寫代碼
testBookService()方法。
現(xiàn)在,回到@ContextConfiguration ,即使它有助于加載應(yīng)用程序上下文,它也不會啟用日志記錄或從application.properties 加載其他屬性 ,例如server.port屬性,在Spring啟動時更改嵌入式tomcat服務(wù)器的端口是必需的應(yīng)用。
要解決該問題,可以使用@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引導(dǎo)日志記錄并加載在application.properties或application.yml文件中定義的其他屬性。
這就是Spring Boot中@ContextConfiguration和@SpringApplicationConfiguration批注之間的區(qū)別 。 即使與SpringJUnit4ClassRunner一起使用并幫助加載應(yīng)用程序上下文,后來的版本還是有用的,因為它還啟用了日志記錄和其他Spring Boot功能。
最好在為Spring Boot應(yīng)用程序編寫集成測試時使用@SpringApplicationConfiguration ,以使測試盡可能接近生產(chǎn)環(huán)境。
感謝您到目前為止閱讀本文。 如果您喜歡我對@SpringApplicationConfiguration和@ContextConfiguration批注的解釋,請與您的朋友和同事分享。 如果您有任何疑問或反饋,請留言。
翻譯自: https://www.javacodegeeks.com/2019/02/difference-spring-boot-integration-test.html
總結(jié)
以上是生活随笔為你收集整理的Spring Boot集成测试中@ContextConfiguration和@SpringApplicationConfiguration之间的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux中的进程(linux下的进程)
- 下一篇: Spring Boot微服务,Docke