不能用Mockito 2来嘲笑最终的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); } }
当我们尝试初始化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
依赖关系,它可以自动启用模拟最终类的能力。
你可以使用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 }
PowerMock实现了自己的MockMaker
,这导致与Mockito模拟器内联不兼容,即使PowerMock只是作为一个依赖而被添加,而没有被使用。 如果路径中存在两个org.mockito.plugins.MockMaker
,则只能使用一个,哪一个是未定的。
然而,PowerMock可以将调用委托给另一个MockMaker,然后在没有PowerMock的情况下运行测试。 由于PowerMock 1.7.0,可以使用PowerMock配置进行配置。
MockMaker可以通过创建文件org/powermock/extensions/configuration.properties
并设置:
mockito.mock-maker-class=mock-maker-inline
在PowerMock中使用Mockito模拟器内联示例: https : //github.com/powermock/powermock-examples-maven/tree/master/mockito2