【发布时间】:2019-08-17 11:19:25
【问题描述】:
koin测试结果如下:
org.koin.core.error.NoBeanDefFoundException: No definition found for '<class_name>' has been found. Check your module definitions.
EmailValidatorUtilImpl 类实现得很好,
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()
}
}
此外,实现类被很好地注入
var loginUtilsModule = module {
single { EmailValidatorUtilImpl() }
}
在应用程序类中:
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'
【问题讨论】:
-
你有没有试过去掉
KoinComponent,只保留KoinTest做测试? -
是的,试过了。 KoinComponent 不是故意的。
-
你能在此处的测试文件中添加你的导入并在 gradle 中测试依赖项吗?
-
@Napster 在问题中更新。
标签: android unit-testing kotlin dependency-injection koin