首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Koin: NoBeanDefFoundException,检查模块定义

Koin: NoBeanDefFoundException,检查模块定义
EN

Stack Overflow用户
提问于 2019-08-17 11:19:25
回答 3查看 17.5K关注 0票数 10

koin测试结果如下:

org.koin.core.error.NoBeanDefFoundException: No definition found for '<class_name>' has been found. Check your module definitions.

EmailValidatorUtilImpl实现得很好,

代码语言:javascript
复制
import org.junit.After
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin
import org.koin.dsl.module
import org.koin.test.KoinTest
import org.koin.test.inject

class EmailValidatorUtilImpl : EmailValidatorUtil {

    private val pattern = Pattern.compile(EMAIL_PATTERN)
    private var matcher: Matcher? = null

    override fun validateEmail(email: String): Boolean {
        matcher = pattern.matcher(email)
        return matcher!!.matches()
    }

    companion object {
        private val EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&'()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$"
    }
}

同时,在KoinTest中注入如下所示:

代码语言:javascript
复制
class EmailValidatorUtilImplTest : KoinTest, KoinComponent {

    private val validatorUtilImpl: EmailValidatorUtilImpl by inject()

    @Before
    fun setUp() {
        startKoin { module { single { EmailValidatorUtilImpl } } }
    }

    @Test
    fun `is valid email returns true`() {
        val isEmailValid = validatorUtilImpl.validateEmail("someone@somewhere.com")
        Assert.assertTrue(isEmailValid)
    }

    @Test
    fun `is invalid email returns false`() {
        val isEmailValid = validatorUtilImpl.validateEmail("invalid_email")
        Assert.assertFalse(isEmailValid)
    }

    @After
    fun tearDown() {
        stopKoin()
    }
}

此外,实现类被很好地注入为

代码语言:javascript
复制
var loginUtilsModule = module {
    single { EmailValidatorUtilImpl() }
}

在申请课程中:

代码语言:javascript
复制
startKoin {
            androidLogger(Level.DEBUG)
            androidContext(this@SampleApplication)
            modules(listOf(
                    loginUtilsModule
            ))
        }

依赖关系(app/build.gradle):

代码语言:javascript
复制
    // di
    implementation 'org.koin:koin-androidx-viewmodel:2.0.1'
    implementation 'org.koin:koin-androidx-scope:2.0.1'
    implementation 'org.koin:koin-android:2.0.1'

    // test
    testImplementation 'org.mockito:mockito-core:2.28.2'
    testImplementation 'org.koin:koin-test:2.0.1'
    testImplementation 'junit:junit:4.12'

    // android test
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'org.koin:koin-test:2.0.1'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-19 19:02:24

我发现了这个问题,错误是模块而不是(or.koin.core.KoinApplication) 模块。

代码语言:javascript
复制
    @Before
    fun setUp() {
        startKoin { module { single { EmailValidatorUtilImpl } } }
    }

因此,解决方案和正确版本如下:

代码语言:javascript
复制
    startKoin { modules(loginUtilsModule) }
票数 16
EN

Stack Overflow用户

发布于 2020-05-25 11:42:53

我也有同样的问题,但在我的例子中,Koin无法解决接口的实现。我有:

代码语言:javascript
复制
interface MessagesRepository {...}

class MessagesRepositoryImpl : MessagesRepository {...}

class GetMessagesUseCase(private val messagesRepository: MessagesRepository) {...}

在Koin模块中,我写道:

代码语言:javascript
复制
single { MessagesRepositoryImpl() }
single { GetMessagesUseCase(get()) }

所以Koin找不到MessagesRepository的一个实例来将它注入GetMessagesUseCase。指定单例类型显式解决了问题(但可能有更好的解决方案):

代码语言:javascript
复制
single<MessagesRepository> { MessagesRepositoryImpl() }
single { GetMessagesUseCase(get()) }
票数 20
EN

Stack Overflow用户

发布于 2020-07-15 09:33:10

代码语言:javascript
复制
 single { MessagesRepositoryImpl() as MessagesRepository }

山一郎瑞恩,你能做到的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57535800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档