Android kotlin mockMaker issues

2019-06-22 13:07发布

问题:

Hi i am trying to mock a final class(as all classes in kotlin are final by default) and added the following dependencies in my gradle:

testImplementation 'junit:junit:4.12'
testImplementation 'au.com.dius:pact-jvm-consumer-junit_2.11:3.5.10'
testImplementation "org.mockito:mockito-android:2.13.0"
testImplementation 'org.mockito:mockito-inline:2.13.0'
testImplementation "org.mockito:mockito-core:2.13.0"
//testImplementation 'io.mockk:mockk:1.8'
testImplementation 'org.assertj:assertj-core:3.8.0'

androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
androidTestImplementation 'junit:junit:4.12'
androidTestImplementation "org.mockito:mockito-core:2.13.0"
androidTestImplementation "org.mockito:mockito-android:2.13.0"
androidTestImplementation 'org.mockito:mockito-inline:2.13.0'
androidTestImplementation "com.android.support.test.espresso:espresso-intents:3.0.2"

the mockito-inline is supposed to enable you to mock a final kotlin class and so i added to both my java unit test and my instrumental test using testImplementation and androidTestImplementation

On building the project i get the following error:

More than one file was found with OS independent path 'mockito-extensions/org.mockito.plugins.MockMaker'

Any ideas whats going on? if i remove the androidTestImplementation of the mockitio inline, it compiles fine but when running intrumental test i get the mockito error saying it cannot mock a final class.

回答1:

In order to be able to mock final classes in Kotlin, you’ll need to create a file org.mockito.plugins.MockMaker (literally) that contains only this line

mock-maker-inline

and place it into test/resources/mockito-extensions.

For more info please read https://antonioleiva.com/mockito-2-kotlin/.



回答2:

As per this answer you cannot mock final classes in androidTest- it is a limitation explained in the Mockito Github issue tracker here:

There is no real possibility to make this [mocking of final classes] work in Android at the moment as it lacks the instrumentation API on top of which we are operating. The Android VM is not a standard VM and only implements a subset of the Java specification. As long as Google does not choose to extend its JVM, I am afraid that this feature will not work.



回答3:

In my case, I got this error because I use implementation "org.mockito:mockito-inline:2.13.0" instead of testImplementation "org.mockito:mockito-inline:2.13.0"