簡體   English   中英

如何模擬和測試這個內部靜態類

[英]How to Mock and test this Inner static class

我是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; 
            }

        })

    }
  }
}

我想這可以完成第一個方法的工作....也許我也可以驗證一些對象是在超類中設置的並且不再是null,那會沒事的?

    @Mock
    Object1 o1;

    @Mock
    Object2 o2;

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

但如何最好地測試doSomethingWithInnerClass ??? 我的意思是,我知道我可以驗證它被調用....但這個匿名類參數我想測試。 我很感激你的建議,Thanx

我相信你需要改變你的想法。 例如,而不是驗證setInSuperClass使用Powermock調用,您應該驗證調用的結果。 有沒有設置的字段? 這個領域有吸氣劑嗎? 是否存在可由此字段驅動的其他行為?

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

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

您不應該驗證私有變量是否已設置。 您應該驗證對對象的后續行為產生的影響。 因此,為了運行retreat方法,您需要做什么,然后在封閉對象上調用其他方法,該方法使用該私有變量的值。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM