使用Mockito调用super.method()

Dea*_*Iss 8 java testing junit super mockito

首先,我想说我正在使用遗留代码,无论我想要多少,我都无法改变它.

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

class foo extends JApplet(){

       public void destroy(){
          super.destroy();
 }
}
Run Code Online (Sandbox Code Playgroud)

通常情况下,如果这不是一个被调用的超级方法,那么在测试用例中就足够了:

verify(foo).destroy();
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

      class foo extends JApplet(){

       public void destroy(){
          callSuperDestroy();
       }
       public void callSuperDestroy(){
           super.destroy();
       }}
Run Code Online (Sandbox Code Playgroud)

然后验证:

verify(foo).callSuperDestroy();
Run Code Online (Sandbox Code Playgroud)

  • 这没有帮助。我认为,一旦知道该方法已经过测试,就应该验证对该方法的调用。如果验证了对callSuperDestroy的调用,则还必须测试callSuperDestroy,这可能与在原始设计中进行的调用一样昂贵。 (2认同)

MrB*_*end 1

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