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

Mockito-如何模拟类的抽象方法(即回调)并表达期望

全弘深
2023-03-14

我试图对一个抽象类进行单元测试,因此需要为该类的抽象方法提供一个模拟实现。

我想我是在一个利基的情况(!)因为@mock@spy似乎都没有帮助。

  • 尝试mockito.mock(simpleclient.class,mockito.calls_real_methods)但这完全破坏了我的抽象类(创建它时不调用构造函数,运行到NPE)
  • 尝试了@spy,但这要么需要一个真实类的实例(我不能提供它,因为它是抽象的duh),要么尝试调用一个不存在的no-arg构造函数。

共有1个答案

董桐
2023-03-14

我发现了以下内容

>

  • 为了采用第一种方法(mockito.mock),他们添加了使用任意构造函数正确构造底层真实对象的功能(希望在此之后,Moquito会在您对每个方法表示期望时对其进行“存根”处理,如下所示):

    MyClass mock = Mockito.mock(MyClass.class, Mockito.withSettings()
    .useConstructor("stringArg", 17)
    .defaultAnswer(Mockito.CALLS_REAL_METHODS));
    
    // ...
    
    Mockito.when(mock.onMyAbstractMethod(Mockito.anyInt())).then(
    invocation -> mock.callAnotherRealMethodOnTheMock(invocation.getArgument(0)));
    

    为了实现第二种方法,@spy确实需要一个创建的类实例,所以在这种情况下,您确实需要首先对它进行子类化。

            Mockito.doAnswer(invocation -> mock.callAnotherRealMethodOnTheMock(invocation.getArgument(0)))
            .when(mock).onMyAbstractMethod(1);
    

  •  类似资料:
    • 下面是抽象类的代码: 现在,我应该如何为编写单元测试,并且应该如何在中模拟会话? 我在Stackoverflow上尝试了不同的解决方案,但仍然无法模拟它并获得会话模拟。

    • 我正在尝试对扩展抽象基的类进行单元测试。以下是“类似的类”,以供说明: 下面是我正在尝试的单元测试: 当我做这个测试的时候 java.lang.NullPointerException 在中 我知道自动连线的“滤水器”没有初始化。但接下来,我只想在我的单元测试中模拟抽象的“非抽象”方法。 我该如何使用EasyMock来实现这一点呢?另外,我不知道和应该做什么。

    • 问题内容: 使用模拟编写单元测试时遇到问题。我需要模拟的对象有很多吸气剂,我确实在代码中称呼它们。但是,这些不是我的单元测试的目的。因此,有一种方法可以模拟所有方法,而不是一个个地模拟它们。 这是代码示例: 这是我需要测试的服务等级 在测试类中,测试方法就像 因此,有一种方法可以避免将所有无用的“ field1”的“ when”写入“ field20” 问题答案: 您可以控制模拟的默认答案。在创建

    • 让我向您展示getCurrentWeatherWithForecastUsecase类actgually是什么样子: } //这很容易,它只需要一个天气存储库,并要求它获取结果。我把它发送回调用者,调用者将显示它。 更新: 以下是故障的整个堆栈跟踪:

    • 问题内容: 我在某些测试中使用Mockito。 我有以下课程: 我只想模拟的第二个调用。第一次调用必须调用real方法。有没有办法做到这一点? 问题答案: Mockito不支持此功能。 这可能不是你要寻找的答案,但是你看到的是不采用设计原则的症状: 偏重于继承而不是继承 如果你提取策略而不是扩展超类,那么问题就不存在了。 但是,如果不允许你更改代码,但无论如何都必须对其进行测试,并且以这种尴尬的方

    • 可以模拟抽象类,也可以使用Mockito注释将模拟类注入抽象类。我现在有以下情况: 我想在AbstractClassUnderTest上使用类似@InjectMocks的东西,但它不能与@Mock结合使用。Powermock的Whitebox的当前情况是有效的,但我很好奇是否可以通过注释来解决它。我找不到任何解决方案或示例。 (我知道对测试抽象类的反对意见,我个人更愿意测试一个具体的实现,只使用@