2011-11-24 60 views
0

嗨,我是單元測試的新手。是否可以訪問私有方法?在JUNIT中訪問非公開的對象方法

一個非常簡單的例子

ObjectA 
---------- 

File file; 

private void setupFile(){ 
    //do something 
    file = "C:\file.dat" 
} 

在測試用例

File sth = ObjectA.setupFile(); 
assertNotNull(sth); 

我無法測試文件變量是否處於空方法ObjectA.setup() 如我不能運行ObjectA.setupFile()

我不確定這樣做是否會讓sens e在單元測試方面。

那麼是一個更好的做法,寫每一個方法返回某些並將它們公開爲更容易的單元測試?

在此先感謝

+0

不要爲了單元測試而公開私有方法。私有方法將被公共方法調用(如果不是,它們應該被刪除)。爲了跟蹤被調用的私有方法,使用覆蓋工具。 –

回答

2

一般情況下,你應該避免改變的方法/字段的訪問,使測試。如果你這樣做,那麼你冒着開發者直接使用該方法的風險。

但是,如果您確實需要,然後使其受保護,因爲Deco說是一種好方法,所以它可以從JUnit測試中訪問。如果你這樣做,確保它是有據可查的,這是一種內部使用的方法。

更好的方法是測試公共方法的行爲;你不應該關心一個類的內部實現細節,所以你只應該測試公共方法。很難從你的代碼中知道,但可以推測,setupFile()稍後會對其他方法產生影響,所以你可以測試這些效果,而不是文件不爲空。

可以在測試中解決外部依賴(如文件系統依賴關係,環境變量),或者直接注入到類中。對於一般原則,請參閱我的回答How to test code dependent on environment variables using JUnit?

+0

感謝您的詳細解答。 我同意我們不應該爲了測試而改變可視性。 所以單元測試更像是一個對象的測試行爲,我提到的目的應該由調試器+編譯器完成 – vincentlcy

0

如果不是絕對需要有方法爲私有,你可以把它作爲包私有(即默認訪問),這樣你可以在JUnit測試直接調用它。

包私有方法只能用於它們聲明的包中,並且不能成爲類的API的一部分。你聲明一個私有方法包,通過在它的聲明中沒有修飾符。

下面是一個例子來說明:

public class MyClass() { 
int foo; 

public MyClass() { 
    this.foo = 0; 
} 

void notSoComplexCalculationMethod(int a) { 
    foo = a * 2; 
} 
    //Other methods here . . . 
} 

public class MyClassTest extends TestCase { 
    private MyClass myClass; 

    protected void setUp() { 
    super.setUp(); 
    myClass = new MyClass(); 
    } 

    public void testNotSoComplexCalculationMethod() { 
    int a = 2; 

    assertEquals(4, myClass.notSoComplexCalculationMethod(a)); 
    //Unit test passes, yay! Now you've tested a package private method. 
    } 
} 
+0

感謝您的答案,因爲我的應用程序很小,不會發布我認爲設置它們包的可見性將會有所幫助 – vincentlcy