不能使用Mockito 2模拟最终的Kotlin课程

bla*_*her 15 java android unit-testing mockito kotlin

我无法使用Mockito 2模拟Kotlin决赛课.我还在使用Robolectric.

这是我的测试代码:

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

    // more mocks

    @Mock
    MyKotlinLoader kotlinLoader;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我们尝试初始化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'
Run Code Online (Sandbox Code Playgroud)

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

Mockito cannot mock/spy because : - final class

请注意我使用的是Mockito版本2,我正在使用inline依赖项,它可以自动启用模拟最终类的功能.

Art*_*nov 13

PowerMock实现了自己的功能MockMaker,导致与Mockito mock-maker-inline不兼容,即使PowerMock只是作为依赖项添加而未被使用.如果org.mockito.plugins.MockMaker路径中存在两个,则可以使用任何一个,其中一个未确定.

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

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

mockito.mock-maker-class=mock-maker-inline
Run Code Online (Sandbox Code Playgroud)

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


Rom*_*ych 9

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

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

mock-maker-inline
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

文档教程的链接


DeK*_*szn 1

您可以使用 Powermock 来实现此目的,例如:

import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.spy;
import static org.powermock.api.mockito.PowerMockito.when;

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@PrepareForTest({FinalClass1.class, FinalClass2.class})
public class Test {
    @Rule
    public PowerMockRule rule = new PowerMockRule();

    ... // your code here
}
Run Code Online (Sandbox Code Playgroud)