我上了最后一堂课,像这样:
public final class RainOnTrees{ public void startRain(){ // some code here } }
我在其他这样的班级中使用这个班级:
public class Seasons{ RainOnTrees rain = new RainOnTrees(); public void findSeasonAndRain(){ rain.startRain(); } }
在我的JUnit测试类中,Seasons.java我想模拟RainOnTrees该类。我该如何使用Mockito做到这一点?
仅在Mockito v2中可以模拟最终/静态类/方法。
将此添加到你的gradle文件中:
testImplementation 'org.mockito:mockito-inline:2.13.0'
使用Mockito常见问题解答中的 Mockito v1,这是不可能的:
`What are the limitations of Mockito - Needs java 1.5+ - Cannot mock final classes
…`
Mockito 2现在支持最终的类和方法!
但是现在这是一个“孵化”功能。它需要一些步骤来激活它,如《 Mockito 2的新增功能》所述:
最终课程和方法的模拟是一个孵化器,可以选择加入。它结合使用Java代理工具和子类,以实现这些类型的可模拟性。由于此功能与我们当前的机制不同,并且此机制具有不同的局限性,并且我们希望收集经验和用户反馈,因此必须明确激活此功能才能使用;通过创建src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker包含单行的文件,可以通过模仿扩展机制完成此操作:
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());
在随后的里程碑中,团队将带来使用该功能的编程方式。我们将为所有无法模拟的场景确定并提供支持。请继续关注,请告诉我们您对此功能的看法!