2012-06-04 31 views
1
私有類

訪問我有裏面的私有類公共類:jMockit對

public class Out 
{ 
    private class In 
    { 
     public String afterLogic; 

     public In(String parameter) 
     { 
      this.afterLogic = parameter+"!"; 
     } 
    } 
} 

而且想測試與jMockit的課堂上。沿着這些路線的東西:

@Test 
public void OutInTest() 
{ 
    Out outer = new Out(); 
    Object ob = Deencapsulation.newInnerInstance("In", outer); //LINE X 
} 

問題是,在LINE X中,當試圖將ob轉換爲In時,In類無法識別。

任何想法如何解決這個問題?

謝謝!

+0

將'In'類訪問器更改爲public? – GETah

+0

@GETah不幸的是,我不認爲這是一種選擇,或者這個問題不會被公佈。 – chaostheory

回答

0

正如評論中所建議的,一種方法是將內部類的訪問修飾符從private改爲public。 第二種方法(如果你不想公開你的內部類),你可以測試實際調用內部類方法的外部類的公共方法。

+0

默認範圍比公開更好。這裏提出了一個很好的觀點。應該努力通過類的暴露API儘可能多地測試類。 –

0

將內部類的範圍更改爲默認值,然後確保測試位於相同的包中。

2

In中唯一的構造函數需要String參數。因此,您需要傳遞參數值:

Object ob = Deencapsulation.newInnerInstance("In", outer, "test"); 
+0

我不認爲這會導致測試的編譯時問題能夠聲明'In'的實例。儘管它可能解決了尚未受到影響的運行時問題。 –

+0

這是行不通的:因爲In是一個私人類,所以我不能將ob轉換成In。 – mors

+1

當然不是,因爲'In'在'Out'之外是不可見的......但是仍然可以通過Reflection來調用'ob'上的方法。然而,測試一個私人內部類的初始想法是一個糟糕的想法;一個類的私有部分(方法,字段,*或*嵌套/內部類)不應該直接在測試中執行;相反,測試只應該使用包含類的非私有方法。 –

0

有兩種方法,第一種是在其他帖子中提到的將範圍更改爲公開的方法。我支持的第二點是,完全避免測試私人課程。由於測試應該針對類的可測試代碼或方法進行編寫,而不是針對默認行爲。

+0

如果內部類是複雜的,那麼應該重構代碼以使它成爲一個單獨的公共實體來實現模塊化和更簡單的測試。 –

+0

這個類很簡單,但問題仍然存在:是否可以測試一個私有類,而不需要公開它的工作,保護包公用? – mors