1. 概述

在这篇简短的教程中,我们将重点介绍如何使用 Mockito 来模拟(mock)final 类final 方法

与我们之前介绍 Mockito 框架的其他文章类似(例如 Mockito VerifyMockito When/ThenMockito 的 Mock 方法),我们依然会使用下面这个 MyList 类作为测试中的协作对象(collaborator):

public class MyList extends AbstractList<String> {
    final public int finalMethod() {
        return 0;
    }
}

此外,我们还会创建一个 final 的子类:

public final class FinalList extends MyList {

    @Override
    public int size() {
        return 1;
    }
}

2. 模拟 Final 方法

只要 Mockito 配置正确,模拟 final 方法和普通方法一样简单

@Test
public void whenMockFinalMethod_thenMockWorks() {

    MyList myList = new MyList();

    MyList mock = mock(MyList.class);
    when(mock.finalMethod()).thenReturn(1);

    assertThat(mock.finalMethod()).isNotZero();
}

在这个例子中,我们创建了 MyList 的真实实例和 mock 实例,分别调用 finalMethod(),验证 mock 行为是否生效。

3. 模拟 Final 类

模拟 final 类和模拟普通类一样简单

@Test
public void whenMockFinalClass_thenMockWorks() {

    FinalList mock = mock(FinalList.class);
    when(mock.size()).thenReturn(2);

    assertThat(mock.size()).isNotEqualTo(1);
}

和上面类似,我们创建了 FinalList 的真实实例和 mock 实例,模拟了 size() 方法并验证 mock 是否按预期工作。

⚠️ 注意:默认情况下,Mockito 是不能直接 mock final 类和方法的。要实现这一点,需要启用 Mockito 的 inline mock maker 扩展。

启用方式

src/test/resources/mockito-extensions/ 目录下创建一个名为 org.mockito.plugins.MockMaker 的文件,内容如下:

mock-maker-inline

这个配置会告诉 Mockito 使用其 inline mock maker,从而支持对 final 类和方法的模拟。

4. 小结

在这篇文章中,我们介绍了如何通过 Mockito 的扩展机制来模拟 final 类和方法。

虽然默认情况下 Mockito 不支持这一功能,但通过简单的配置即可轻松实现。

完整示例代码可以在 GitHub 上找到:https://github.com/eugenp/tutorials/tree/master/testing-modules/mockito-simple



原始标题:Mock Final Classes and Methods with Mockito