使用Mockito调用super.method()

时间:2013-12-11 15:45:32

标签: java testing junit mockito super

首先,我想说我正在处理遗留代码,无论我想要多少,我都无法改变它。

顺便说一下,我要做的就是验证是否调用了super.method()。这是我试图用Mockito / Junit测试的具体内容:

class foo extends JApplet(){

       public void destroy(){
          super.destroy();
 }
}

通常情况下,如果不是一个被称为超级方法的测试用例,这样的东西就足够了:

verify(foo).destroy();

我已经看过几次问这个问题,通常回答是“继承是坏的,改变你的代码”,遗憾的是我完全不能做。是否有人知道我可以做的任何框架或小小技巧来测试这个?

提前致谢 - 我知道这是一个棘手的问题!

4 个答案:

答案 0 :(得分:5)

您可以重构代码以在其他方法中调用super方法,例如:

      class foo extends JApplet(){

       public void destroy(){
          callSuperDestroy();
       }
       public void callSuperDestroy(){
           super.destroy();
       }}

然后验证:

verify(foo).callSuperDestroy();

答案 1 :(得分:2)

似乎JMockit可能会这样做。看看这篇文章:

Powermock - mocking a super method invocation

答案 2 :(得分:1)

我没试过这个,但是不可能创建一个自定义的ClassLoader,它只覆盖JApplet类的加载吗?然后你可以创建自己的JApplet,它记住是否调用了destroy()。

答案 3 :(得分:1)

您实际需要测试的是调用超级方法的效果仍然成立。实现这一目标的最简单方法是通过调用超级方法,这只是一个设计细节。

考虑到这一点:

  1. 为超级方法编写测试。
  2. 为您的子方法编写测试,并在此测试中调用同一类的超级方法测试(通过直接调用或通过子类化测试)。