日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

使用Spring Boot隔离集成测试和模拟依赖项

發布時間:2023/12/3 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Spring Boot隔离集成测试和模拟依赖项 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

集成測試可能很慢且不可靠,因為它們依賴于系統中過多的組件。 在某種程度上,這是不可避免的:這里的集成測試是為了驗證系統的每個部分如何與其他內部或外部組件一起玩。

但是,我們可以通過僅分解所需的依賴關系而不是整個系統來改進某些集成測試。 讓我們想象一個依賴于數據庫,第三方REST API和消息隊列的應用程序:

現在假設我們希望集成測試驗證僅包含對REST API的調用但不包含對數據庫或消息隊列的調用的行為。 舉一個具體的例子,假設我們要檢查REST客戶端是否正確配置為3秒鐘后超時。

為此,我們需要的是一個小型Controller ,該Controller將在返回答案到REST客戶端之前等待,以模擬REST API。 等待時間將作為參數傳遞給查詢字符串。

@Profile("restTemplateTimeout") @RestController @RequestMapping(value = "/test") public class DelayedWebServerController {@RequestMapping(value = "/delayRestTemplate", method = GET)public String answerWithDelay(@RequestParam Long waitTimeMs) {if (waitTimeMs > 0) {try {Thread.sleep(waitTimeMs);} catch (InterruptedException e) {throw new RuntimeException(e);}}return "Delayed Result";}}

@Profile批注用于什么? 如果我們將此控制器注入到我們的標準應用程序上下文中,則有幾個缺點:

  • 測試將會很慢:我們只需要啟動一個控制器,而不是整個控制器
  • 我們的控制器將由Spring拾取并注入其他所有集成測試中,從而減慢每個集成測試的速度,并可能踩到另一個測試的腳趾

更好的選擇是啟動一個最小的Spring Boot應用程序,僅暴露我們的DelayedWebServerController 。 我們還將告訴Spring Boot僅掃描我們感興趣的軟件包,并排除與持久性相關的自動配置,因為我們不需要它來啟動控制器。 這是在類似以下的Configuration類中完成的:

@Profile("restTemplateTimeout") @Configuration @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) @ComponentScan(basePackages = "my.application.resttemplate.timeout") public class DelayedWebServerConfiguration {//The class is empty and only used to support the annotations }

Spring上下文配置可能會引起混亂,讓我們一個接一個地查看批注:

  • @Profile :這告訴Spring,只有在restTemplateTimeout配置文件處于活動狀態時才應使用此配置。 在本文的進一步內容中,我們將看到如何為特定的集成測試啟用此配置文件。 正是這個注釋防止配置被其他不相關的集成測試所采用。 請注意,我們的DelayedWebServerController具有相同的注釋。
  • @Configuration :標準注釋,用于告訴Spring這是一個上下文配置類。
  • @EnableAutoConfiguration :在這里,我們禁用了某些不需要進行特定測試的Spring Boot“魔術”
  • @ComponentScan :通過僅掃描一個軟件包而不是整個項目,我們可以加快Spring Boot應用程序的啟動速度。 Spring不會選擇此包之外的任何帶有Spring注釋的類。

集成測試如下所示:

@RunWith(SpringJUnit4ClassRunner.class) @WebIntegrationTest("server.port:0") @SpringApplicationConfiguration(classes = DelayedWebServerConfiguration.class) @ActiveProfiles("restTemplateTimeout") public class RestTemplateShould {@Rulepublic ExpectedException thrown = none();@Value("${local.server.port}")private int port;@Autowiredprivate RestTemplate restTemplate;@Testpublic void throw_timeout_if_response_lasts_more_than_two_seconds() {thrown.expect(ResourceAccessException.class);thrown.expectCause(instanceOf(SocketTimeoutException.class));callEndpointWithDelay(3000);}@Testpublic void do_not_throw_timeout_if_response_lasts_less_than_two_seconds() {callEndpointWithDelay(10);}private void callEndpointWithDelay(long delayMs) {restTemplate.getForObject("http://localhost:" + port + "/test/delayRestTemplate?waitTimeMs=" + delayMs, String.class);} }

當然,所有這些類都存儲在我們的測試源文件夾(通常為src/test/java )中,因為生產不需要它們。

讓我們再看一下注解:

  • @RunWith :測試將使用Spring Junit運行程序,該運行程序將負責為我們創建Spring上下文。
  • @WebIntegrationTest :告訴Spring這是一個運行Web應用程序的集成測試,否則默認情況下Spring不會在測試模式下運行HTTP服務器。 我們還將server.port的值設置為0以便Spring Boot選擇一個隨機端口供HTTP服務器監聽。 這允許并行運行多個測試,或者在后臺運行該應用程序的另一個版本。
  • @SpringApplicationConfiguration :我們告訴Spring在哪里可以找到我們之前創建的DelayedWebServerConfiguration類。
  • @ActiveProfiles :啟用restTemplateTimeout配置文件,否則Controller和Configuration將被過濾掉。

現在,我們有一個集成測試,它以一組有限的依賴關系而不是整個應用程序運行。 如果我們想走得更遠并在游戲中添加模擬游戲怎么辦? 當依賴項沒有開發環境,或者過于復雜而無法從開發人員的工作站調用時,可能需要這樣做。 在這種情況下,我們可以將這些模擬添加到Configuration類中,并將它們注入到測試的Spring上下文中。

這是一個Configuration示例,在該示例中,我們注入了一個由Mockito模擬的自定義CustomerService ,而不是默認值:

@Profile("validationTests") @Configuration @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) @ComponentScan(basePackages = {"my.application.controller","my.application.actions"}) public class ValidationEndToEndConfiguration {@Beanpublic CustomerService customerService() {return Mockito.mock(CustomerService.class);} }

通過這種方法,我們可以使集成測試更具彈性。 對于緩慢或不可靠的依賴關系,讓開發人員針對模擬版本運行集成測試會更加有效。 但是,不要忘記,最終您的應用程序將必須與實際系統集成,而不是與模擬系統集成。 因此,讓持續集成服務器至少每天都在真實系統上運行測試是有意義的。

翻譯自: https://www.javacodegeeks.com/2016/02/isolating-integration-tests-mocking-dependencies-spring-boot.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的使用Spring Boot隔离集成测试和模拟依赖项的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。