在Swift中,爲了測試默認訪問級別類,可以將@testable
放在測試類標題中,使內部訪問級別類可以從測試包中訪問和測試,而不需要公開類中的所有內容。我想知道Java是否有辦法達到相同的目的?如何在不公開任何東西的情況下測試Java中的默認訪問級別類?
如何從測試包中測試Java中的默認訪問級別類而不將類中的所有內容都公開?
在Swift中,爲了測試默認訪問級別類,可以將@testable
放在測試類標題中,使內部訪問級別類可以從測試包中訪問和測試,而不需要公開類中的所有內容。我想知道Java是否有辦法達到相同的目的?如何在不公開任何東西的情況下測試Java中的默認訪問級別類?
如何從測試包中測試Java中的默認訪問級別類而不將類中的所有內容都公開?
有在@VisibleForTesting註解一些java庫,但通常它不會阻止非法訪問。即使讓包保護也不能解決所有問題,因爲還有一些其他類可以使用測試代碼,這可能會導致一些意外行爲。我最近偶然發現了很好的結構,使您可以顯示有關暴露出一些方法來測試
public class A{
private int someMethodYouWantToTest(){}
private Testability testability = new Testability();
class Testability{
int exposedMethodForTest(){
someMethodYouWantToTest()
}
}
}
然後在您的測試類
public class Test{
private A underTest = new A()
public void testHiddenMethod(){
a.testability.exposedMethodForTest()
}
}
這樣你的私有方法是私有的意圖,只能訪問如果通過專門的可測試性內部類來清楚地說明它的用途,那麼不會有人偶然在測試之外調用您的方法。這解決了可能從其他地方調用但實際上是私有的包保護業務方法的問題。
在Java中,您可以做的唯一的事情就是讓產品受保護如果您希望在測試代碼中使用它們(即:如果您不希望它們公開)。
例子:我的課經常看起來像
class Whatever
public Whatever() { this(new A(), new B()); };
Whatever(A a, B b) { ...
允許我使用需要依賴注入單元測試的第二個構造;同時依靠生產法規應該總是使用公共構造函數的「慣例」。
所以,即使當我有我不想在我的包外使用的類...我公開的構造函數表明:請使用這一個。
這個想法基本上是你的生產代碼和測試代碼駐留在相同名稱的包中。
換句話說:Java沒有這個好的特性,只允許訪問來測試代碼。
報價是回答了similar question
「
通常不需要單元測試私有方法直接。由於他們是 私人,認爲它們的實現細節。沒有人曾經打算 到打電話給其中的一個,並期望它能夠以特定的方式工作
你應該改爲測試你的公共接口如果 調用你的私有方法的方法是工作如你所期望的那樣,你假設 擴展你的私有方法正常工作。「
這相當於選項1在這個link
如果1不適合你的目標,你可以嘗試在鏈接中提到方法2,3和4
當然,如果測試本來是私有的,那麼它就不是完美的,即使它只在類自己的包中。另一方面,無論如何推薦(並且有很多好處)不依賴於推理,而是依賴於接口。
這意味着:爲客戶端提供一個接口,該接口只聲明您想公開的方法,並讓您的實現中要測試的方法受保護,並且不要將其包含在接口中。