簡體   English   中英

使用Mockito測試超類方法

[英]Using Mockito test super class method

class Sup {
          public void someMethod(){
              // do something
          }
    }
class Sub extends Sup {
            public void method(Object obj) {
                  if (obj == null) {
                      super.someMethod();
                      return;
                  }

                 // do something
            }
    }
class SubTest {

        @Test
        public void testMethodArgIsNull() {
                 Sub s = new Sub();
                 Sub spyS = spy(s);

                 spyS.method(null);

                 //test case fails
                 verify(spyS).someMethod();

         }
    }

如果我在Sub like中重新定義方法“ method”,而不是調用super.someMethod(),則如果我調用someMethod(),則測試用例通過。 但我不想對代碼進行任何更改。 幫我測試代碼。

我不知道你為什么要避免更改代碼,但你可能有自己的理由。 您不能簡單地驗證是否對間諜調用了super方法。 但是,您仍然可以在不更改代碼的情況下測試此方法。 但是,這樣做的唯一方法就是沒有間諜。 換句話說,您將必須使用其他模擬的斷言或驗證來驗證someMethod的功能。 例如,如果Sup類被如此實現:

class Sup {
      private boolean somethingDone = false;
      public boolean isSomethingDone() {
          return somethingDone;
      }

      public void someMethod(){
          somethingDone = true;
      }
}

然后,您可以這樣編寫測試用例:

@Test
public void testMethodArgIsNull() {
    Sub s = new Sub();
    s.method(null);
    assertThat(s.isSomethingDone(), is(true));
}

話雖這么說, super.someMethod() Sub.someMethod() (不存在)之外的任何東西調用super.someMethod() )看起來就像是在等待發生的Sub.someMethod() 如果Sub.someMethod()不存在,則super.someMethod()等同於someMethod() 但是,如果將來有人要重寫它,您是否真的想讓method(Object o)偷偷地繞過被重寫的那個並調用超級實現?

通過調用super.someMethod()super.someMethod()冒險將來的風險。

暫無
暫無

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

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