【问题标题】:Mock call super method - protected模拟调用超级方法 - 受保护
【发布时间】:2018-10-12 19:48:31
【问题描述】:
我的问题是我想测试 B 类,使用模拟 super 调用方法,因为我不需要在那里测试 super.doSomething()。
public class A{
protected void doSomething(){
//some Code
}
}
public class B extends A{
@Override
protected void doSomething(){
//some Code
super.doSomething();
}
}
怎么做?
【问题讨论】:
标签:
java
unit-testing
junit
mockito
protected
【解决方案1】:
为什么你甚至想做这样的事情?
它为您提供的保证是:B.doSomething() 行为正确,前提是 A.doSomething() 永远不会改变,并且 A 永远是 B 的超类。
您的目标是密封A 和B 的实施吗?单元测试的目标通常是相反的——鼓励重构。在你的情况下:
- 如果有人以破坏性方式修改
A.doSomething(),您的测试仍然会通过,(误报)
- 如果有人从
B.doSomething() 到A.doSomething() 只提取了一行代码(这不太可能,因为他们已经面向代码重用),测试很可能会失败(false否定)
【解决方案2】:
这是不可能的。
尝试使用组合而不是继承来使您的测试工作。
我的意思是,如果可能的话,请执行以下操作:
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 也可能派上用场。