无法使用 Mockito 2 模拟最终的 Kotlin 类

2022-09-01 19:13:43

我无法使用 Mockito 2 模拟 Kotlin 最终类。此外,我还在使用Robolactric。

这是我的测试代码:

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class Test {

    // more mocks

    @Mock
    MyKotlinLoader kotlinLoader;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
}

当我们尝试初始化方法中的模拟时,测试失败。setUp()

此外,我在代码中使用以下 gradle 依赖项:

testCompile 'org.robolectric:robolectric:3.3.2'
testCompile 'org.robolectric:shadows-multidex:3.3.2'
testCompile 'org.robolectric:shadows-support-v4:3.3.2'
testCompile("org.powermock:powermock-api-mockito2:1.7.0") {
    exclude module: 'hamcrest-core'
    exclude module: 'objenesis'
}
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-inline:2.8.9'

所有其他单元测试都使用此配置通过,但是一旦我尝试模拟Kotlin类,它就会引发以下错误:

Mockito cannot mock/spy because : - final class

请注意,我正在使用Mockito版本2,并且我正在使用自动启用模拟最终类的能力的依赖项。inline


答案 1

PowerMock实现了它自己的,这导致与Mockito模拟制作者内联不兼容,即使PowerMock只是作为依赖项添加而不是使用。如果路径中存在两个,则只能使用任何一个,哪一个是不确定的。MockMakerorg.mockito.plugins.MockMaker

但是,PowerMock可以将调用委托给另一个MockMaker,然后测试在没有PowerMock的情况下运行。从PowerMock 1.7.0开始,可以使用PowerMock配置进行配置。

可以通过创建文件和设置来配置 MockMaker:org/powermock/extensions/configuration.properties

mockito.mock-maker-class=mock-maker-inline

将 Mockito mock-maker-inline 与 PowerMock 一起使用的示例:https://github.com/powermock/powermock-examples-maven/tree/master/mockito2


答案 2

从 Mockito 2.1.0 开始,有可能模拟最终类型、枚举和最终方法。在对原始问题的评论中已经提到了这一点。

为此,您需要创建一个文件夹(如果不存在),并添加带有名称和以下行的文件:test/resources/mockito-extensionsorg.mockito.plugins.MockMaker

mock-maker-inline

enter image description here

文档教程的链接


推荐