Тестирование пользовательского интерфейса Android с помощью эспрессо, мокито, коина и котлина дает проблемы с подделкой - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь проверить свой фрагмент, и мой тест выглядит следующим образом:

@ExperimentalCoroutinesApi
@RunWith(AndroidJUnit4::class)
@LargeTest
class AccountFragmentTest {
    @Mock
    private lateinit var repositoryMock: Repository
    private lateinit var accountViewModel: AccountViewModel
    private var fakeAccount: Account? = null
    private val dataModule = module {
        viewModel { AccountViewModel(get(), get()) }
    }
    private val coroutinesModule = module {
        single { CoroutineContextProvider() }
    }
    @get:Rule
    val activityRule = ActivityTestRule(AccountActivity::class.java, true, false)

    @Before
    fun setup() {
        MockitoAnnotations.initMocks(this)
        loadKoinModules(listOf(dataModule, coroutinesModule))
        accountViewModel =
            AccountViewModel(
                repositoryMock,
                TestCoroutinesContextProvider()
            )
        val json = javaClass.classLoader?.getResourceAsStream("transactions.json").toString()
        fakeAccount = Moshi.Builder().build().adapter<Account>(Account::class.java).fromJson(json)
        `when`(accountViewModel.accountLiveData).thenReturn(MutableLiveData<Account>().apply {
            value = fakeAccount
        })
    }


    @Test
    fun transactionsRecyclerView_shouldBeShown() = runBlockingTest {
        activityRule.launchActivity(null)
        onView(ViewMatchers.withId(R.id.transactionsRecyclerView)).check(matches(isDisplayed()))
    }

Однако в моих тестах я получаю следующее исключение:

    ----- begin exception -----
E/TestRunner: java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
        at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:74)
        at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
        at $Proxy9.isTypeMockable(Unknown Source)
        at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:29)
        at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22)
        at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:240)
        at org.mockito.internal.creation.MockSettingsImpl.build(MockSettingsImpl.java:228)
        at org.mockito.internal.MockitoCore.mock(MockitoCore.java:61)
        at org.mockito.Mockito.mock(Mockito.java:1908)
        at org.mockito.internal.configuration.MockAnnotationProcessor.processAnnotationForMock(MockAnnotationProcessor.java:44)
        at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:19)
        at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)
        at org.mockito.internal.configuration.IndependentAnnotationEngine.createMockFor(IndependentAnnotationEngine.java:38)
        at org.mockito.internal.configuration.IndependentAnnotationEngine.process(IndependentAnnotationEngine.java:62)
        at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:49)
        at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:41)
        at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:69)
        at me.myapp.package.ui.main.AccountFragmentTest.setup(AccountFragmentTest.kt:53)
        at java.lang.reflect.Method.invoke(Native Method)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:76)
        at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
        at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:531)
        at org.junit.rules.RunRules.evaluate(RunRules.java:20)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:104)
        at org.junit.runners.Suite.runChild(Suite.java:128)
        at org.junit.runners.Suite.runChild(Suite.java:27)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
        at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
        at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:392)
        at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2189)
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/tools/ToolProvider;
        at or
    ----- end exception -----

IЯ подозреваю, что это может иметь отношение к некоторым зависимостям, наступающим друг на друга, так что вот мое app/build.gradle:

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2"
    implementation "androidx.appcompat:appcompat:1.1.0"
    implementation "androidx.core:core-ktx:1.1.0"
    implementation "androidx.constraintlayout:constraintlayout:1.1.3"
    implementation "androidx.lifecycle:lifecycle-extensions:2.1.0"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0"
    implementation "androidx.recyclerview:recyclerview:1.0.0"
    implementation "com.squareup.moshi:moshi-kotlin:1.8.0"
    implementation "com.squareup.moshi:moshi-adapters:1.8.0"
    implementation "androidx.cardview:cardview:1.0.0"
    implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
    implementation "org.koin:koin-android:2.0.1"
    implementation "org.koin:koin-androidx-viewmodel:2.0.1"
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    kapt "com.squareup.moshi:moshi-kotlin-codegen:1.8.0"

    testImplementation "org.koin:koin-test:2.0.1"
    testImplementation "junit:junit:4.12"
    testImplementation "org.robolectric:robolectric:4.3"
    testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
    testImplementation "android.arch.core:core-testing:1.1.1"
    testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.2'

    androidTestImplementation 'org.mockito:mockito-android:3.0.0'
    androidTestImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
    androidTestImplementation "android.arch.core:core-testing:1.1.1"
    androidTestImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.2'
    androidTestImplementation "androidx.test:runner:1.2.0"
    androidTestImplementation "androidx.test.espresso:espresso-core:3.2.0"
    androidTestImplementation "junit:junit:4.12"
    androidTestImplementation('org.threeten:threetenbp:1.3.2') {
        exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
    }
    // debugImplementation because LeakCanary should only run in debug builds.
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.2.0'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test:rules:1.2.0'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    debugImplementation "com.squareup.leakcanary:leakcanary-android:2.0-beta-3"
    debugImplementation('androidx.fragment:fragment-testing:1.1.0') {
        exclude group: 'androidx.test', module: 'core'
    }

Я надеюсь, что кто-то может помочь здесь, большое спасибо!

...