2013-10-27 21 views
3

我是Mockito和PowerMock的新手,並且在獲取這個時遇到了麻煩。這是相當多的情況下,我有:如何模擬和測試這個內在的靜態類

class A { 

    static class B { 

    public class B(Object1 o1, Object2 o2) { 
     setInSuperClass(o1); // this is private method... 
     doSomethingWithInnerClass (new Object3() { 

      @Override 
      public void retreat() { 
       someVar = new Object5(o2); // someVar is from superclass and is private, I know I can get it with PowerMock 
      } 

      @Override 
      public boolean doSomething(){ 
       return true; 
      } 

     }) 

    } 
    } 
} 

我想這會爲第一種方法做的工作....也許我還可以驗證某些對象的超集和IS NOT NULL任何更多,而會好嗎?

@Mock 
    Object1 o1; 

    @Mock 
    Object2 o2; 

    public void test() { 
     B b = new B(o1, o2); 
     PowerMockito.verifyPrivate(b).invoke("setInSuperClass", 1 , o1); 
    } 

但如何最好地測試doSomethingWithInnerClass?我的意思是,我知道我可以驗證它被稱爲....但這個匿名的類論證我想測試。 我欣賞意見, 謝謝

+0

你的類的代碼不能編譯。 –

+0

@JBNizet,我現在無法訪問代碼,是的,可能會有一些錯誤,但這是對問題的一般描述 – Julia

+0

由於您的類I的所有者會將靜態內部移動到子包中的另一個類。我也沒有看到測試私有方法被調用的價值。 –

回答

1

我相信你需要重定向你的想法。例如,不是驗證使用Powermock調用setInSuperClass,而是驗證呼叫的結果。有沒有設置的字段?這個領域有吸氣嗎?是否還有一些其他行爲是由該領域驅動的,可以進行驗證?

doSomethingWithInnerClass也是如此。不做任何事情的方法調用可能不在那裏。必須有電話的結果。無論是一些輸出,調用另一種方法/類或副作用。驗證結果。

如果這確實是不可能的,您可能需要創建內部類的子類進行測試。這個子類將覆蓋被測試方法調用的方法。

0

您不應該驗證是否設置了私有變量。您應該驗證對對象後續行爲產生的影響。所以,爲了運行你的retreat方法,你需要做什麼,然後在封閉對象上調用其他方法,該方法使用該私有變量的值。

如果無法從封閉對象中知道變量已經設置,那麼這表明變量本身並不是真正需要的。

相關問題