我还有最后一节课,大概是这样的:

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


当前回答

我正在编写我在Java 11中模拟final/private类及其方法的各种失败尝试之后所遵循的步骤,这些尝试最终对我有用。

在里面创建一个名为org.mockito.plugins.MockMaker的文件 您的test/resources/mockito-extensions文件夹。请创建 Mockito-extensions文件夹(如果还没有)。 在上面的org.mockito.plugins.MockMaker文件中添加一行mock-maker-inline内容 添加

@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"javax.management.*", "jdk.internal.reflect.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*"})
@PrepareForTest(Utility.class)

类级别的注释。

在测试类中设置过程

  @Before
  public void setup () {
    MockitoAnnotations.initMocks(this);
    Mockito.mockStatic(ClassToBeMocked.class); 
  }

使用Mockito.when(..).thenReturn(..)进行断言 在多个测试用例的情况下,添加下面的代码

  @After
  public void after() {
        Mockito.framework().clearInlineMocks();
  }

我正在使用的模拟版本:3.9.0 Java版本:11

其他回答

使用Powermock。这个链接展示了如何做到这一点:https://github.com/jayway/powermock/wiki/MockFinal

我正在编写我在Java 11中模拟final/private类及其方法的各种失败尝试之后所遵循的步骤,这些尝试最终对我有用。

在里面创建一个名为org.mockito.plugins.MockMaker的文件 您的test/resources/mockito-extensions文件夹。请创建 Mockito-extensions文件夹(如果还没有)。 在上面的org.mockito.plugins.MockMaker文件中添加一行mock-maker-inline内容 添加

@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"javax.management.*", "jdk.internal.reflect.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*"})
@PrepareForTest(Utility.class)

类级别的注释。

在测试类中设置过程

  @Before
  public void setup () {
    MockitoAnnotations.initMocks(this);
    Mockito.mockStatic(ClassToBeMocked.class); 
  }

使用Mockito.when(..).thenReturn(..)进行断言 在多个测试用例的情况下,添加下面的代码

  @After
  public void after() {
        Mockito.framework().clearInlineMocks();
  }

我正在使用的模拟版本:3.9.0 Java版本:11

是的,同样的问题在这里,我们不能模拟一个最终类与Mockito。准确地说,Mockito不能模仿/监视以下内容:

最后的课程 匿名类 原始类型

但是在我看来,使用包装器类代价很大,所以改用PowerMockito。

正如其他人所说,这不会在Mockito的盒子外工作。我建议使用反射来设置测试代码正在使用的对象上的特定字段。如果您发现自己经常这样做,可以将此功能打包到一个库中。

说句题外话,如果你是那个给课程打期末分数的人,那就别这么做了。我遇到这个问题是因为我正在使用一个API,其中所有内容都被标记为final,以防止我合理地需要扩展(mock),我希望开发人员没有假设我永远不需要扩展该类。

为运行mockito成功添加这些依赖项:

testImplementation org.mockito: mockito-core: 2.24.5 testImplementation“org.mockito: mockito-inline: 2.24.5”