2011-03-24 69 views
0

我有一個方法返回一個私有類的實例,我需要從不同的包中訪問它的方法來進行單元測試。這些類生活在同一個文件中。 它是這樣的:公用方法在Java中返回私有類實例?

文件:A.java

public class A{ 
    B b; 
    public B getB(){ 
     return b; 
    } 
    public setB(B b){ 
     this->b = b; 
    } 
} 

class B{ 
    C c; 
    public C getC(){ 
     return c; 
    } 
    public setC(C c){ 
     this->c = c; 
    } 
} 

class C{ 
    public int getInt(){ 
     return 1; 
    } 
} 

所以...基本上的問題是:任何的方法,B或C可達不知何故?我是否有義務將B和C放置在不同的文件中,並將它們公之於衆?

+0

在大多數情況下,你應該堅持每個文件1班。在'A.class'這裏包含'B'和'C'的理由是什麼? – 2011-03-24 02:33:30

+1

另外'this-> b'和'this-> c'不是有效的Java語法。 – anubhava 2011-03-24 02:38:35

回答

0

是的,你可以使用反射來調用Ç任何地方,但這種的任何實例的所有方法,從我的POV,是一個黑客,而不是技術。

否則,類ç不會暴露你的的A.class之外。

1

最好的做法是始終將每個頂級類的源代碼放在一個單獨的文件中。如果你不這樣做,你可能運行與編譯困難等

還有的班級BC是否需要public這樣就可以創建單元測試一個單獨的問題。我會說這是個好主意,但也有解決這個幾個方面:

  • 如果你把單元測試在同一個Java包中的類ABC,那麼類(及其方法)將在單元測試中可見。

  • 您可以通過創建public的子類BC來公開測試目的。這些必須在與類ABC相同的Java包中聲明。

  • 您可以創建BC的實例,並使用反射調用它們的方法。 (但是,這是一個單元測試了很多的工作,我不會推薦它!)

請注意,如果你有你的產品代碼和測試代碼單獨的源目錄樹,你可以把測試分類到與ABC相同的程序包中,而不會混淆代碼庫。當您爲生產/發佈構建時,您只需將測試樹中的類留出構建。


順便說一句,在你的例子類BC是「包私人」,而不是「私有」。單元測試一個真正的「私人」班是一個完全不同的問題。

0

技術上類保護;所以只要調用getB和getC的類都在同一個包中,就不會有任何問題。如果從另一個包中嘗試運行GetB GetC,您將看到一些問題,因爲您的其他包將無法訪問實際的類。

這裏TestProt不能被導入,因爲它在tester2軟件包中受到保護。 FILE1:

package tester; 
import tester2.Test; 
public class Testing { 
    public Testing() { 
    Test t = new Test(); 
    TestProt p = t.prot(); 
    } 
} 

FILE2:

package tester2; 
public class Test { 
    public TestProt prot() { 
    return new TestProt(); 
    } 
} 

class TestProt{ 
    public TestProt() { 
    } 
} 
相關問題