9.5 如何使用Mockito模拟final类? | Java Debug 笔记

351 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:如何使用Mockito模拟final类?

我有一个final 类,像下面代码:

public final class RainOnTrees{

   public void startRain(){

        // some code here
   }
}

我正在像使用其他类的方式使用这个类:

public class Seasons{

   RainOnTrees rain = new RainOnTrees();

   public void findSeasonAndRain(){

        rain.startRain();

    }
}

在我的Seasons.java的JUnit测试类中,我想模拟RainOnTrees类。 我该如何使用Mockito做到这一点?

回答1:

但是现在这是一个“孵化”功能。 它需要一些步骤来激活它,如《 Mockito 2的新增功能》所述:

final 类和方法的模拟是一个令人振奋的,可选的功能。 它结合使用Java代理工具和子类,以实现这些类型的可模拟性。 由于此功能与我们当前的机制不同,并且此机制具有不同的局限性,并且我们希望收集经验和用户反馈,因此必须明确激活此功能才能使用; 通过创建包含单行的文件src / test / resources / mockito-extensions / org.mockito.plugins.MockMaker,可以通过模仿扩展机制完成此操作:

mock-maker-inline

创建此文件后,Mockito将自动使用此新引擎,并且可以执行以下操作:

 final class FinalClass {
   final String finalMethod() { return "something"; }
 }

 FinalClass concrete = new FinalClass(); 

 FinalClass mock = mock(FinalClass.class);
 given(mock.finalMethod()).willReturn("not anymore");

 assertThat(mock.finalMethod()).isNotEqualTo(concrete.finalMethod());

在后续的更新中,团队将带来使用该功能的编程方式。 我们将为所有无法模拟的场景确定并提供支持。 请继续关注,请告诉我们您对此功能的看法!