有人知道爲什麼Spring Boot Guide包含兩種不同類型的集成測試? (https://github.com/spring-guides/gs-spring-boot#add-unit-tests)爲什麼在Spring Boot中有不同類型的集成測試
一個用TestRestTemplate,另一個用MockMvc依賴?在每種測試類型中,彈簧引導啓動測試環境。那麼這種分離的原因是什麼?
有人知道爲什麼Spring Boot Guide包含兩種不同類型的集成測試? (https://github.com/spring-guides/gs-spring-boot#add-unit-tests)爲什麼在Spring Boot中有不同類型的集成測試
一個用TestRestTemplate,另一個用MockMvc依賴?在每種測試類型中,彈簧引導啓動測試環境。那麼這種分離的原因是什麼?
當您使用MockMvc
時,您正在測試應用程序的一個實例,其中HTTP請求週期已被模擬。所以,這裏的測試範圍只是您的應用程序的MVC方面。我認爲這通常不會被稱爲「集成測試」,而是更接近單元測試(儘管它的範圍比單個類大得多)。
當您使用TestRestTemplate
您正在測試您的應用程序,即你「雨後春筍」整個應用程序上下文的真正實例,並調用它作爲外部演員。這通常被稱爲「集成測試」,它可能是最接近您的實際使用情況的測試。
現在,由於通過TestRestTemplate
調用的「完整堆棧」集成測試可以提供MockMVC
測試提供的覆蓋範圍的超集,因此您可能想知道爲什麼您會打擾MockMVC
測試。如果是這樣,那麼我認爲這是一個問題... ...
測試範圍; MockMVC
測試用例通常比完整的集成測試更快,更容易啓動(因爲它們使用的應用程序上下文更少)。另外,由於他們使用較少的appolication上下文,您可能不必努力去模擬您的應用上下文在測試中表現不佳的任何方面。
易用性; MockMVC
附帶靜態助手,用於斷言HTTP狀態,詢問和斷言JSON響應等。當然YMMMV,但對於許多人來說,這些易於開發並幫助提供可讀的測試用例。
在實踐中,你也許想用這兩種方法的組合:
MockMVC
測試整個控制器層的詳細測試,包括所有的映射,快樂與悲傷路徑,所有調用以及對HTTP狀態代碼,內容主體等的深刻斷言TestRestTemplate
從用戶角度表達的主要流程的測試例如Save a new Foo
,Search for all Foos
,Submit an invalid Foo update
等使用斷言側重於哪些用戶看到/感興趣的位。
感謝您的詳細解釋!我唯一不能確定的是MockMVC測試更快。它需要完全相同的時間(在我的機器上) – DimarZio