2016-12-11 33 views
0

我剛剛搜索了一下「Joshua Bloch TDD」......沒有多少人出現,這是一個巨大的恥辱,因爲我真的想知道他在這件事上應該說些什麼。Effective Java Item 13 and TDD

項目13(我在看第二版)的標題是「最小化班級和成員的可訪問性」。幾頁之後,他說:

爲了便於測試,您可能想要創建一個類,界面 或更容易訪問member *。 ...爲了測試私人公開課程包私人成員 是可以接受的,但是 不能用於提高任何高於此值的可訪問性... 幸運的是,沒有必要要麼測試可以作爲 部分正在測試的軟件包運行,因此可以訪問它的 程序包專用元素。

*「members」他的意思是「fields,methods,nested classes和nested interfaces」。我知道目前的共識似乎並不包括測試類與應用程序代碼包,甚至沒有一個匹配的結構在src \ test和src \ test下的匹配結構,主要:TDD專家似乎很容易以其他方式構建測試目錄(例如,您有一個名爲「unittests」的目錄,另一個名爲「functionaltests」,另一個名爲「e2etests」)。

具體而言,我遵循「以測試爲導向的面向對象增長軟件」拍賣應用的TDD開發。作者對添加數百種公共方法毫無疑問。此外,在一章之後,我查看了下載的「迄今爲止的結構」,並且他徹底改變了測試目錄結構以將事情劃分爲測試類別。

是否有任何經驗豐富的TDD手在那裏有至少在過去,發現這是一個困境的來源?如果是這樣,你怎麼解決它?

作爲一個實際的例子,我通過開發一個Lucene索引應用程序來削減我的TDD技術的牙齒:它索引文件,然後讓你查詢它們。目前所有的應用程序類都在同一個包中。實際上需要公開的唯一方法是main在一個類別中。然而,當然,我有許多公共方法:它們都可以是封裝私有的,因爲我不使用TDD。

PS爲無標籤「的方式可見性」,所以我選擇了「類的可見性」

看來,我可能已經通過這種方法帶領下來一個相當不幸的路徑採用「面向對象的增長......」,其中過度使用公共方法可能僅僅是因爲它是對技術的示範。哈。

如果你想分割你的測試類,有沒有人曾經使用過這種方法:

\src\unit_tests\java\core\MainTest.java

而且,例如:
\src\func_tests\java\core\MainTest.java

\src\e2e_tests\java\core\MainTest.java

+0

「不包含測試課程與應用程序代碼包」你的意思是gradles'src/main/java/com/foo' vs'src/test/java/com/foo'?在這種情況下,類在同一個包中,但不在同一個目錄中。 – zapl

+0

啊......當然,很抱歉:由於我一直在模擬別人在做什麼,所以暫時忘了我的意見......我將編輯我的問題。這是你如何解決「困境」? –

+0

@mikerodent到底什麼是「困境」? – lexicore

回答

1

爲可製成測試,以作爲包裝的一部分運行正在測試

這並不意味着你必須把你的測試中同一目錄作爲主類,他們只是有要在相同的包這可以很好地分開目錄。假設你有一個包com.acme.foo。所以,你的目錄結構可能是:

src 
    main 
    java 
     com 
     acme 
      foo 
      MainClass 
    test 
    java 
     com 
     acme 
      foo 
      MainClassTest 

MainClassTest是在同一個包MainClass所以它可以訪問包私人的東西。但是這些是獨立的目錄,所以你的結果JAR將不包含MainClassTest

+0

謝謝。對不起,是的,這已經滑了我的腦海!請參閱我的編輯問題。你自己堅持這種模式嗎? –

+0

@mikerodent簡單的答案是肯定的。但是我們也有整合測試的分離項目,我們做了很多BDD(Cucumber),它們具有獨立的目錄結構等。但是我們絕對不會爲了測試而製作'public'。 – lexicore

+0

謝謝......因此,如果我理解正確,那麼現在就不可能在我的不同類之間進行集成測試,因爲它們都在同一個包中,並且,正如我所說的,我不需要任何公共方法。作爲一個新手,集成測試的整個領域有點神祕:在不同的包之間只進行集成測試**是正確的嗎? –

0

我不確定這是如何在Gradle中工作的,因爲我使用的是Maven,但我想象那裏的概念是相似的。因此我會在Maven的腦海中解釋它。 在Maven項目的典型設置是這樣的:

enter image description here

在有srctarget項目的根目錄下。進入target文件夾的一切都是在構建過程中創建的。這意味着src包含我們實際項目的來源。在src下還有兩個其他目錄:maintest。簡單地輸入main就可以完成所有將在生產性代碼中傳遞的信息。 test目錄包含main樹的測試代碼。

因此,通常從src/main/java目錄相同的包的層次結構也存在於src/test/java,因此與相同的包定義中的測試類將有權訪問駐留在main分支producive類的所有成員。

+0

是的,謝謝,它在Gradle中完全一樣。只是TDD項目有時似乎偏離了這種對稱的目錄結構,這意味着它們無法利用包私有訪問。 –