验证在子类上调用此方法时是否调用了重写的超类方法

Paw*_* P. 3 java inheritance junit jmockit mockito

我将使用此示例显示我的问题:
我有一个带有方法的类foo.该类有一个子类,它覆盖了这个方法.
子类'方法调用超类'方法.我可以验证吗?
我不想测试foo超类中的内容.我只需要验证它是否被调用.我知道重构可以帮助(有利于组合而不是继承等),但我无法做到这一点.
有没有办法达到我的需要?
以下是我尝试过的简单示例

package tmp;
import org.junit.Test;
import org.mockito.Mockito;
import static org.mockito.Mockito.times;

public class Example {
    @Test
    public void test() {
        // given
        ChildClass childClass = new ChildClass();
        ChildClass spyChildClass = Mockito.spy(childClass);
        // when
        spyChildClass.foo(100);
        // then
        Mockito.verify((BaseClass) spyChildClass, times(1)).foo(101);
    }
}

abstract class BaseClass {
    public void foo(int n) {
        System.out.printf("BaseClass.foo(%d)%n", n);
    }
}

class ChildClass extends BaseClass {
    @Override
    public void foo(int n) {
        System.out.printf("ChildClass.foo(%d)%n", n);
        super.foo(n + 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是结果:

ChildClass.foo(100)
BaseClass.foo(101)

Argument(s) are different! Wanted:
childClass.foo(101);
-> at tmp.Example.test(Example.java:19)
Actual invocation has different arguments:
childClass.foo(100);
-> at tmp.Example.test(Example.java:16)

Expected :childClass.foo(101);
Actual   :childClass.foo(100);
   <Click to see difference>
Run Code Online (Sandbox Code Playgroud)

显然这不是我想看到的.

我无法修改BaseClass.我不想测试BaseClass(我不负责).我甚至不知道它到底是做什么的.我只需要验证它的方法是否被调用.其他不是我的问题.这是人们维持的问题BaseClass.

jmk*_*een 7

测试类的行为,而不是它的实现.

编写测试以便调用该方法并期望执行某些操作.接下来检查对象现在代表您现在期望它代表的内容.

如果BaseClass.foo预计将某个计数器递增100,Subclass.foo然后将某个计数器递增50,则调用超类,验证计数器现在是150而不是50.

不要偷看它们 - 它们可能会随着时间的推移而改变.测试行为.foo除了增加计数器之外,该方法可以做其他事情 - 检查对象的状态而不是它做了什么.

  • 而案例是... 被测试的行为是调用超类的方法。 (2认同)