[英]Better to use @Autowired or new in Spring test class?
我在為春季應用程序編寫單元測試時遇到一些麻煩,想知道這個問題。
讓我們來看下面的例子:
@SpringBootTest
@RunWith(SpringRunner.class)
public class AlbumDTOConverterTest {
@Autowired
private AlbumDTOConverter albumDTOConverter;
@Test
public void ToEntity_ReturnValue_NotNull() {
AlbumDTO albumDTO = new AlbumDTO("Summer album", new Date(), "This summer, we have made some wonderfull photos. Have a look!", null);
assertNotNull(albumDTOConverter.toEntity(albumDTO));
}
}
為了使@Autowired
正常工作,我正在啟動一個容器,並使用@SpringBootTest
注釋測試類。
問題是我認為我做錯了。 在我看來,我寧願只使用new
運算符而不是使用Spring的IoD來創建AlbumDTOConverter
的新instance
。
你們對此怎么看?
對於單元測試,您不需要整個容器即可啟動。 根據定義,此類單元應單獨進行測試。 使用new關鍵字創建類的實例非常好。 即使該類依賴於其他類,也可以手動創建它們並將其傳遞給該類的適當構造函數。
請注意, 單位與類不同 。 單位的術語在開發人員,尤其是初學者中通常很困惑。 您不必在單元測試中依賴於依賴項注入。 容器只會增加執行測試所需的時間,執行時間長是開發人員避免頻繁運行它們的主要原因。 手動為要測試的單元構建依賴關系樹沒有錯。
從長遠來看,為不同的測試創建類似的輸入可能會導致測試代碼重復,但是幸運的是,針對此問題有最佳實踐,例如共享夾具 。
如果要進行單元測試,則不應每次都使用@Autowire。
基本單元測試說:“單元測試負責測試一段特定的代碼,只是代碼的一小部分功能(單元)”
現在的問題是何時使用彈簧功能?
有時,您需要依賴於Spring框架進行一些單元測試,例如Web服務調用,存儲庫調用等。例如,如果您的存儲庫具有使用@Query批注的自定義查詢,則可能需要測試查詢。 另外,如果要序列化/反序列化對象,則需要確保對象映射正在工作。 當您進行一些參數驗證或錯誤處理時,您可能還想測試您的控制器。 如何確定正確使用Spring? 在這些情況下,您可以利用新的Spring Boot的測試注釋。
我認為這會帶來更好的主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.