如何使用 mockito 模拟最终类

2022-08-31 04:55:44

我有一个最后的课程,像这样:

public final class RainOnTrees{

   public void startRain(){

        // some code here
   }
}

我正在其他一些类中使用这个类,如下所示:

public class Seasons{

   RainOnTrees rain = new RainOnTrees();

   public void findSeasonAndRain(){

        rain.startRain();

    }
}

在我的JUnit测试类中,我想模拟这个类。我如何使用Mockito执行此操作?Seasons.javaRainOnTrees


答案 1

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

但就目前而言,这是一个“孵化”功能。它需要一些步骤来激活它,这些步骤在Mockito 2中的新增功能中进行了描述:

模拟最终的类和方法是一个孵化的、选择加入的功能。它使用 Java 代理工具化和子类化的组合,以实现这些类型的可模拟性。由于这与我们当前的机制的工作方式不同,并且该机制具有不同的限制,并且由于我们希望收集经验和用户反馈,因此必须显式激活此功能才能使用 ;它可以通过mockito扩展机制通过创建包含单行的文件来完成: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());

在随后的里程碑中,团队将带来使用此功能的编程方式。我们将为所有不可接近的场景确定并提供支持。请继续关注,请让我们知道您对此功能的看法!


答案 2

模拟最终/静态类/方法只能使用Mockito v2。

在 gradle 文件中添加此内容:

testImplementation 'org.mockito:mockito-inline:2.13.0'

这在 Mockito v1 中是不可能的,来自 Mockito FAQ

Mockito的局限性是什么

  • 需要 java 1.5+

  • 无法模拟最终类

...


推荐