当前位置: 首页 > 知识库问答 >
问题:

使用Mockito 2模拟最终类

景俊拔
2023-03-14

我正在将Powermock从我目前正在进行的项目中移除,因此我试图仅用Mockito(Mockito-Core-2.2.28)重写一些现有的unitary测试

无法模拟/Spy类Com.ExternalPackagePath.ExternalClass

Mockito无法模仿/监视,因为:

  • 最终类
public class MyClassToTest extends TestCase {
    private MyClass myClass;
    @Mock private Externalclass ext;  // This class is final, I would like to mock it

    @Override
    protected void setUp() throws Exception {
        MockitoAnnotations.initMocks(this); // <<<< The exception is thrown here
        ext = Mockito.mock(Externalclass.class);
    }
}

正如Mockito文档(https://github.com/Mockito/Mockito/wiki/what%27s-new-in-mockito-2,§mock the unmockable)中提到的,我添加了org.Mockito.plugins.mockmaker文件。这是我的项目的树:

  • 项目
    • SRC
      • com.packagePath.mypackage
        • MyClass
        • com.packagePath.mypackage
          • MyClastOtest
          • 模拟-扩展
            • org.mockito.plugins.mockmaker

            谢谢!

共有1个答案

琴宾鸿
2023-03-14

奇怪的是,你的解决方案似乎起作用了。
根据他们在Github上的文档,它说。

对最终类和方法的模拟是一个潜在的、可选的特性。它使用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());

在后续的里程碑中,团队将带来一种使用该特性的编程方式。我们将识别并为所有不可模仿的场景提供支持。请继续关注并告诉我们您对此功能的看法!

我的工作结构现在看起来是这样的。

 类似资料:
  • 我在github示例中发现了如何使用standart Mockito创建final类(BluetoOthgatt.class)实例: 但从Mockito常见问题: Mockito的局限性是什么 需要java 1.5+ 无法模拟最终类 ... 我检查了它是来自标准android-sdk的BluetoothGatt,所以它看起来像模拟的最终类。现在我尝试build project,以确保该测试工作正常

  • 我无法使用mockito2模拟一个Kotlin final类。另外我还在用Robolectric。 这是我的测试代码: 请注意,我使用的是Mockito Version2,我使用的是依赖项,它自动启用模拟最终类的功能。

  • 问题内容: 我上了最后一堂课,像这样: 我在其他这样的班级中使用这个班级: 在我的JUnit测试类中,Seasons.java我想模拟RainOnTrees该类。我该如何使用Mockito做到这一点? 问题答案: 仅在Mockito v2中可以模拟最终/静态类/方法。 将此添加到你的gradle文件中: 使用Mockito常见问题解答中的 Mockito v1,这是不可能的: `What are

  • 我有最后一节课。 org.mockito.exceptions.base.MockitoExc0019:不能模拟/间谍类改造2.响应Mockito不能模拟/监视以下内容:-最终类-匿名类-原始类型 如何使用Powermockito模拟响应类?

  • 有没有可能的方法来模拟一个私人的最终场? 提前谢谢你们。

  • } 当我做它将打印芒果,但它仍然在打印苹果。如果有人能帮助我只使用MOCKITO而不是PowerMock等。