首页 > 解决方案 > Mockito - 如何在类的抽象方法(即回调)上模拟和表达期望

问题描述

我正在尝试对抽象类进行单元测试,因此需要为类的抽象方法提供模拟实现。

我认为我处于利基境地(!),因为两者都没有@Mock@Spy似乎没有帮助。

(上下文,虽然你不应该需要它:该类是一个消息传递客户端,例如 hassendMessage()abstract onMessage()方法,显然我需要使用真正的实现sendMessage()并模拟回调abstract onMessage()

标签: javamockingmockitoabstractspy

解决方案


我发现了以下

  • 为了采用第一种方法Mockito.mock(:

    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需要创建一个类的实例,所以在这种情况下,你真的需要先对它进行子类化。

额外说明onMyAbstractMethod:如果 say返回 void,则会发生一个单独的问题,也很丑陋,在这种情况下,Mockito.when...由于语言限制,语法不起作用,这是一个记录不充分的事实。一个人需要反过来说:

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

推荐阅读