一尘不染

Java如何使用Mockito模拟最终课程

java

我上了最后一堂课,像这样:

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做到这一点?


阅读 533

收藏
2020-03-08

共2个答案

一尘不染

仅在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

…`

2020-03-08
一尘不染

Mockito 2现在支持最终的类和方法!

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

最终课程和方法的模拟是一个孵化器,可以选择加入。它结合使用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());

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

2020-03-08