Koin: NoBeanDefFoundException, 检查你的模块定义
Koin: NoBeanDefFoundException, Check your module definitions
金币测试结果如下:
org.koin.core.error.NoBeanDefFoundException: No definition found for '<class_name>' has been found. Check your module definitions.
classEmailValidatorUtilImpl
执行得很好,
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如下:
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()
}
}
此外,实现 class 已被注入
var loginUtilsModule = module {
single { EmailValidatorUtilImpl() }
}
在申请中class:
startKoin {
androidLogger(Level.DEBUG)
androidContext(this@SampleApplication)
modules(listOf(
loginUtilsModule
))
}
依赖项(app/build.gradle):
// 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'
我发现了问题,错误是模块而不是 模块 (or.koin.core.KoinApplication)
@Before
fun setUp() {
startKoin { module { single { EmailValidatorUtilImpl } } }
}
所以,解决方案和正确的版本是:
startKoin { modules(loginUtilsModule) }
我遇到了同样的问题,但就我而言,Koin 无法解析接口的实现。我有:
interface MessagesRepository {...}
class MessagesRepositoryImpl : MessagesRepository {...}
class GetMessagesUseCase(private val messagesRepository: MessagesRepository) {...}
我在 Koin 模块中写道:
single { MessagesRepositoryImpl() }
single { GetMessagesUseCase(get()) }
所以 Koin 找不到 MessagesRepository
的实例来将其注入 GetMessagesUseCase
。指定单例类型明确解决了问题(但也许有更好的解决方案):
single<MessagesRepository> { MessagesRepositoryImpl() }
single { GetMessagesUseCase(get()) }
single { MessagesRepositoryImpl() as MessagesRepository }
Yamashiro Rion你可以做到
金币测试结果如下:
org.koin.core.error.NoBeanDefFoundException: No definition found for '<class_name>' has been found. Check your module definitions.
classEmailValidatorUtilImpl
执行得很好,
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如下:
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()
}
}
此外,实现 class 已被注入
var loginUtilsModule = module {
single { EmailValidatorUtilImpl() }
}
在申请中class:
startKoin {
androidLogger(Level.DEBUG)
androidContext(this@SampleApplication)
modules(listOf(
loginUtilsModule
))
}
依赖项(app/build.gradle):
// 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'
我发现了问题,错误是模块而不是 模块 (or.koin.core.KoinApplication)
@Before
fun setUp() {
startKoin { module { single { EmailValidatorUtilImpl } } }
}
所以,解决方案和正确的版本是:
startKoin { modules(loginUtilsModule) }
我遇到了同样的问题,但就我而言,Koin 无法解析接口的实现。我有:
interface MessagesRepository {...}
class MessagesRepositoryImpl : MessagesRepository {...}
class GetMessagesUseCase(private val messagesRepository: MessagesRepository) {...}
我在 Koin 模块中写道:
single { MessagesRepositoryImpl() }
single { GetMessagesUseCase(get()) }
所以 Koin 找不到 MessagesRepository
的实例来将其注入 GetMessagesUseCase
。指定单例类型明确解决了问题(但也许有更好的解决方案):
single<MessagesRepository> { MessagesRepositoryImpl() }
single { GetMessagesUseCase(get()) }
single { MessagesRepositoryImpl() as MessagesRepository }
Yamashiro Rion你可以做到