首先,我想说的是,我正在使用遗留代码,无论我多么想更改它,我都无法更改。
有了这些,我要做的就是验证是否调用了super.method()。这正是我试图用Mockito/Junit测试的内容:
class foo extends JApplet(){
public void destroy(){
super.destroy();
}
}
通常情况下,如果不是调用的超级方法,那么在测试用例中这样的东西就足够了:
verify(foo).destroy();
我已经看到这个问题被问过几次了,通常的回答是"继承很糟糕,请更改代码",不幸的是,我根本无法做到这一点。有人知道我可以做什么框架或小技巧来测试这个吗?
提前谢谢-我知道这是个棘手的问题!
您可以重构代码以调用其他方法中的超级方法,如:
class foo extends JApplet(){
public void destroy(){
callSuperDestroy();
}
public void callSuperDestroy(){
super.destroy();
}}
然后验证:
verify(foo).callSuperDestroy();
实际需要测试的是,调用超级方法的效果仍然有效。实现这一点的最简单方法是调用超级方法,这只是一个设计细节。
考虑到这一点:
- 为超级方法写一个测试
- 为您的子方法编写一个测试,并在此测试中调用同一类上的超级方法的测试(通过直接调用或子类化测试)
看来JMockit可能能够做到这一点。查看此帖子:
Powermock-模拟一个超级方法调用
我还没有尝试过,但难道不能创建一个只覆盖JApplet类加载的自定义ClassLoader吗?然后您可以创建自己的JApplet,它可以记住destroy()是否被调用。