2017-02-15 15 views
2

我讀的書Effective Jave,在Item 13: Minimize the accessibility of classes and members,它提到:我們如何測試軟件包私有類?

爲了方便測試,你可能會做一個類,接口或成員更容易獲得。這沒問題。爲了測試它而製作一個公共類包私有的私有成員是可以接受的,但是將可訪問性提高到更高的水平是不可接受的。換句話說,將類,接口或成員作爲程序包導出的API的一部分來促進測試是不可接受的。

我知道我們應該封裝的成員,來自客戶端的隱藏信息,我們可以通過訪問與getter和setter方法的類測試,但 我應該如何理解使類包私人訪問,如果是的話如何對它進行測試?

回答

1

我猜筆者的意思是,不是

package my.package; 

class TestableClass { 
    private String property; 
} 

可以能見度改變

package my.package; 

class TestableClass { 
    String property; 
} 

隨着第二個執行,你可以從測試包中的my.package訪問屬性像

package my.package; 

class TestableClassTest { 
    // ... 
} 

同時,一個子類不能訪問該財產 - 這是協同protected的收益。

+0

邁克爾下進行定位,感謝您的回覆。我曾考慮過這個問題,但自動運行所有測試並不方便。不幸的是,將測試類文件分成不同的包是不可能的。 +1爲你 – haifzhan

1

基本上這意味着測試儀類應駐留在同一個包作爲測試類。這將使您的測試類和所有包受保護的成員和方法都可以被您的測試類訪問。這些類可能位於不同根:你的測試類可能是src/myrootpackage.first.second.MyClass下,你的測試類可以test/myrootpackage.first.second.MyClass.Tester

+0

它是有道理和可能性,它是唯一的方式來測試包私人類。謝謝! +1 – haifzhan

+0

我的當前設置如下'src.main.java.myrootpackage.first.MyClass.java'和'src.test.java.myrootpackage.first.test.MyClassTest.java',但測試類找不到源類。如果我刪除'test'並將測試用例放在'src.test.java.myrootpackage.first.MyClassTest.java'下,那麼它就可以工作。 –

+0

你是正確的,如果被定義,你想測試你的方法保護(或包專用,即無關鍵字),那麼你的測試類必須是在同一個包。在你的設置中,部分路徑「src.main.java」和「src.test.java」不是包的一部分。所以,你有你的課程「myrootpackage.first」和你的測試課程「myrootpackage.first.test」。一旦你在「myrootpackage.first」中移動了你的測試類,它就會看到你的類的受保護或者包私有成員。你還可以看到包在你的類「包myrootpackage.first」的第一行 –