验证是否使用Mockito调用super.method()



首先,我想说的是,我正在使用遗留代码,无论我多么想更改它,我都无法更改。

有了这些,我要做的就是验证是否调用了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();

实际需要测试的是,调用超级方法的效果仍然有效。实现这一点的最简单方法是调用超级方法,这只是一个设计细节。

考虑到这一点:

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

看来JMockit可能能够做到这一点。查看此帖子:

Powermock-模拟一个超级方法调用

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

最新更新