如何在startKoin()方法上修复NoSuchMethodError

时间:2019-06-14 14:28:50

标签: android unit-testing testing kotlin koin

我正在尝试在Koin DI帮助下启动测试,例如示例https://insert-koin.io/docs/2.0/documentation/koin-core/index.html#_making_your_test_a_koincomponent_with_kointesthttps://insert-koin.io/docs/2.0/getting-started/junit-test/ 但每次出现 NoSuchMethodError 。我在做什么错了?

首先,我使用的是从 main 包中创建的模块,但是出现此错误。然后,我在 test 包中创建了模块,但是错误仍然相同。

我的代码

class ComponentA
class ComponentB(val a: ComponentA)

class SignInTest : KoinTest {

    val componentB : ComponentB by inject()

    @Before
    fun before() {
        startKoin { modules(
            module {
                single { ComponentA() }
                single { ComponentB(get()) }
            }) }
    }

    @Test
    fun test_test() {
        val componentA = get<ComponentA>()

        assertNotNull(componentA)
        assertEquals(componentA, componentB.a)
    }

    @After
    fun after() {
        stopKoin()
    }

java.lang.NoSuchMethodError:org.koin.core.definition.BeanDefinition。(Lorg / koin / core / qualifier / Qualifier; Lorg / koin / core / qualifier / Qualifier; Lkotlin / reflect / KClass;)V

at net.app.at.features.signin.SignInTest$before$1$1.invoke(SignInTest.kt:79)
at net.app.at.features.signin.SignInTest$before$1$1.invoke(SignInTest.kt:26)
at org.koin.dsl.ModuleKt.module(Module.kt:31)
at org.koin.dsl.ModuleKt.module$default(Module.kt:29)
at net.app.at.features.signin.SignInTest$before$1.invoke(SignInTest.kt:36)
at net.app.at.features.signin.SignInTest$before$1.invoke(SignInTest.kt:26)
at org.koin.core.context.GlobalContextKt.startKoin(GlobalContext.kt:72)
at net.app.at.features.signin.SignInTest.before(SignInTest.kt:35)

1 个答案:

答案 0 :(得分:1)

请检查您正在使用的Koin库的版本。

我有同样的问题。事实证明我在build.gradle中:

implementation "org.koin:koin-android:2.0.0-beta-1" 

和下面几行:

testImplementation "org.koin:koin-test:2.0.0"

当我在两个地方都设置版本2.0.0时-它起作用了。