使用Mockito测试超类方法

时间:2012-01-06 03:34:28

标签: java unit-testing mocking mockito


    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中重新定义方法“method”,而不是调用super.someMethod(),如果我调用someMethod(),则传递测试用例。但我不想对代码进行任何更改。帮我测试代码..

1 个答案:

答案 0 :(得分:3)

我不知道您为什么要避免更改代码,但您可能有自己的理由。你不能简单地验证在间谍上调用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()看起来像是等待发生的陷阱。如果Sub.someMethod()不存在,则super.someMethod()相当于someMethod()。但是,如果有人在将来覆盖它,你真的希望method(Object o)偷偷绕过被覆盖的那个并且无论如何都要调用超级实现吗?

通过致电super.someMethod(),除了冒未来的错误之外,你什么也得不到。