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
.
测试类的行为,而不是它的实现.
编写测试以便调用该方法并期望执行某些操作.接下来检查对象现在代表您现在期望它代表的内容.
如果BaseClass.foo
预计将某个计数器递增100,Subclass.foo
然后将某个计数器递增50,则调用超类,验证计数器现在是150而不是50.
不要偷看它们 - 它们可能会随着时间的推移而改变.测试行为.foo
除了增加计数器之外,该方法可以做其他事情 - 检查对象的状态而不是它做了什么.
归档时间: |
|
查看次数: |
7754 次 |
最近记录: |