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/