我将用这个例子来展示我的问题:
我有一个带有方法的类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);
}
}
这是结果:
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>
显然这不是我想看到的。
我无法修改BaseClass
。我不想测试BaseClass
(我对此不负任何责任)。我什至不需要知道它到底是做什么的。我只需要验证它的方法是否被调用。其他的都不是我的问题。这是维护人的问题BaseClass
.
测试行为班级的,不是执行.
编写测试,以便调用该方法并预期执行某些操作。接下来检查该对象现在代表您现在期望它代表的内容。
If BaseClass.foo
预计会将某些计数器增加 100,但是Subclass.foo
将某个计数器增加 50,然后调用超类,验证计数器现在是 150 而不仅仅是 50。
不要偷看如何——它们可能会随着时间的推移而改变。测试行为。方法foo
除了增加计数器之外,还可以做其他事情 - 检查对象的状态而不是它做了什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)