2016-11-14 48 views
0

我想了解進口類在測試時JUnit的方式。
我注意到,創建與SRC類的名稱相同,並且在同一封裝的模擬類,會導致測試導入一個,而不是真正的SRC類。
例如:重寫SRC clases與測試類的Java單元測試

src/main/java/MyObject.java 
src/main/java/ObjectPrinter.java 

src/test/java/MyObject.java 
src/test/java/ObjectPrinterTest.java 

如果雙方的main/java/MyObject.javatest/java/MyObject.java聲明同一個包(這兩個文件開始用相同的package XXX decleration)。 的ObjectPrinter.java(這是由在ObjectPrinterTest.java測試時間稱爲)將具有import XXX.MyObject decleration。

它是如何在測試時間import XXX.MyObject將導入test/java/MyObject.java和'生產'電話將調用src/java/MyObject.java
這種目錄建築是否安全?這是常用的嗎?
我在哪裏可以閱讀有關此特定流程的更多信息?

謝謝!

回答

1

這是Java的依賴關係是如何工作的結果。在運行JUnit測試時,將src/test/java目錄用作要運行的項目,將src/main/java視爲依賴項。當java試圖解析導入路徑時,它不知道路徑是來自內部文件還是依賴項。因此,它將首先嚐試在項目中解決它,然後查看依賴關係。如果它在項目中找到匹配項,則不會再進一步​​查看。同樣,當運行「生產」代碼時,src/main/java被用作與src/test/java無關的主項目,因此它將始終獲得MyObject的原始實現。

類重寫以這種方式在技術上是安全的,但不是一個好的做法。這將使不清楚是否使用了原始實施。

如果你想保留MyObject的大部分邏輯,但是覆蓋它的一部分,你應該在src/test/java中創建一個stub class,即。 MyObjectStub。

取代邏輯的邏輯測試的另一種方式是使用一個嘲笑庫如Mockito

+0

謝謝,正是答案我一直在尋找FOR.A小的後續問題,是在src/test目錄的第一類查找,即使是項目依賴(即,如果myObject的是不是在同一個項目/依賴作爲測試類,但是在並行項目中也有src/MyObject和test/MyObject)。它會始終首先在測試文件夾中查看,然後只能轉到src文件夾,無論距離原始項目有多遠?)。換句話說,單元測試運行總是首先查找src/test,'production'運行總是查找'src/main',而不管它們是否在任何jar /依賴路徑中? – ABR

+0

從任何其他項目都不會看到src/test,因此不會在生產代碼中使用這些類/資源。如果外部項目對您的項目有依賴性,他們也永遠不會被看到。只要你的單元測試位於src/test(它們應該是),它們將始終優先考慮來自src/test的資源。 – Thiefster