本文正在参加「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());
在后续的更新中,团队将带来使用该功能的编程方式。 我们将为所有无法模拟的场景确定并提供支持。 请继续关注,请告诉我们您对此功能的看法!