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
从 Mockito 2.1.0 开始,可以模拟最终类型、枚举和最终方法。对原始问题的评论中已经提到了这一点。
为此,您需要创建一个文件夹(如果不存在)test/resources/mockito-extensions
并添加具有名称org.mockito.plugins.MockMaker
和此行的文件:
mock-maker-inline
Run Code Online (Sandbox Code Playgroud)
您可以使用 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)
归档时间: |
|
查看次数: |
4737 次 |
最近记录: |