java - 使用 Mockito 测试父类(super class)方法

标签 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(),则测试用例通过。但我不想对代码进行任何更改。帮我测试代码..

最佳答案

我不知道您为什么要避免更改代码,但您可能有自己的理由。您不能简单地验证是否在 spy 上调用了 super 方法。但是,您仍然可以在不更改代码的情况下测试此方法。不过,做到这一点的唯一方法就是没有 spy 。换句话说,您将必须通过对其他模拟的断言或验证来验证 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));
}

话虽这么说,从 Sub.someMethod()(不存在)以外的任何地方调用 super.someMethod() 看起来就像一个等待发生的陷阱.如果 Sub.someMethod() 不存在,则 super.someMethod() 等同于 someMethod()。但是,如果将来有人要覆盖它,您真的希望 method(Object o) 偷偷绕过被覆盖的方法并调用 super 实现吗?

通过调用 super.someMethod() 除了冒着 future 出现错误的风险,你什么也得不到。

关于java - 使用 Mockito 测试父类(super class)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8753061/

相关文章:

java - 将 HashMap 对象转换为 ResultSet

java - JTextArea 的输入

java - 来源和资源之间的区别

unit-testing - 编写集成测试时如何访问主包中的函数?

java - Java 中的 EasyMock 和文件

java - GridBagLayout 相对于 JButton 高度设置 JScrollPane

python - 使用哪个 `pandas`测试库

c# - 如何测试asp.net邮件是否被发送

Python 使用 mock 进行多个用户输入

ruby - Rspec——模拟另一个类中的方法