我的问题是我想测试B类,使用模拟超级调用方法,因为我不需要在那里测试super.doSomething()。
public class A{
protected void doSomething(){
//some Code
}
}
public class B extends A{
@Override
protected void doSomething(){
//some Code
super.doSomething();
}
}
怎么做?
答案 0 :(得分:0)
这是不可能的。
尝试使用合成而不是继承来使测试工作。
我的意思是,如果可能的话,请执行以下操作:
public class B extends A{
//notice the composition of class A into class B
private A a;
........
@Override
protected void doSomething(){
//some Code
a.doSomething();
}
......
}
在这里,您可以轻松地模拟测试中的a
。
如果这不是选择,那么您必须模拟super.doSomething()
方法中的所有内容。 powermockito
也可以派上用场。
答案 1 :(得分:0)
为什么你甚至想做这样的事情?
它给你的保证是: B.doSomething()行为正确,前提是A.doSomething()永远不会改变并且假设A永远是B的超类 。
您的目标是密封A
和B
的实施吗?单元测试的目标通常恰恰相反 - 鼓励重构。在你的情况下:
A.doSomething()
,您的测试仍会通过,(误报)B.doSomething()
提取一行代码到A.doSomething()
(这不是那么不可能,因为它们已经面向代码重用),测试很可能会失败(a 误报)