模拟调用超级方法 - 受保护
Mock call super method - protected
我的问题是我想用模拟超级调用方法测试 B class,因为我不需要在那里测试 super.doSomething()。
public class A{
protected void doSomething(){
//some Code
}
}
public class B extends A{
@Override
protected void doSomething(){
//some Code
super.doSomething();
}
}
怎么做?
这不可能。
尝试使用组合而不是继承使您的测试工作。
我的意思是,如果可能,请执行以下操作:
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
也可能派上用场。
为什么你会想要做这样的事情?
它给你的保证是:B.doSomething() 行为正确,前提是 A.doSomething() 永远不会改变,前提是 A 永远保持B 的超类。
您的目标是密封实施 A
和 B
吗?单元测试的目标通常是相反的——鼓励重构。你的情况:
- 如果有人以破坏性的方式修改
A.doSomething()
,您的测试仍然会通过,(误报)
- 如果有人只提取了从
B.doSomething()
到 A.doSomething()
的一行代码(这不太可能,因为他们已经面向代码重用),测试很可能会失败(假阴性)
我的问题是我想用模拟超级调用方法测试 B class,因为我不需要在那里测试 super.doSomething()。
public class A{
protected void doSomething(){
//some Code
}
}
public class B extends A{
@Override
protected void doSomething(){
//some Code
super.doSomething();
}
}
怎么做?
这不可能。
尝试使用组合而不是继承使您的测试工作。
我的意思是,如果可能,请执行以下操作:
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
也可能派上用场。
为什么你会想要做这样的事情?
它给你的保证是:B.doSomething() 行为正确,前提是 A.doSomething() 永远不会改变,前提是 A 永远保持B 的超类。
您的目标是密封实施 A
和 B
吗?单元测试的目标通常是相反的——鼓励重构。你的情况:
- 如果有人以破坏性的方式修改
A.doSomething()
,您的测试仍然会通过,(误报) - 如果有人只提取了从
B.doSomething()
到A.doSomething()
的一行代码(这不太可能,因为他们已经面向代码重用),测试很可能会失败(假阴性)