我当前的Android应用程序将Koin
用作DI
def koin_version = '2.0.1'
api "org.koin:koin-androidx-scope:$koin_version"
api "org.koin:koin-androidx-viewmodel:$koin_version"
api "org.koin:koin-androidx-ext:$koin_version"
androidTestImplementation "org.koin:koin-test:$koin_version"
我希望测试已将我的房间数据库注入其中的工人
为了进行测试,我希望注入我的Room数据库的内存版本。
我的工作版本是
def work_version = '2.3.0'
implementation "androidx.work:work-runtime:$work_version"
implementation "androidx.work:work-runtime-ktx:$work_version"
androidTestImplementation "androidx.work:work-testing:$work_version"
这是我正在运行的测试
@RunWith(AndroidJUnit4::class)
class MyWorkerTest : KoinTest {
private lateinit var context: Context
@Before
fun startKoinForTest() {
context = InstrumentationRegistry.getInstrumentation().targetContext
if (GlobalContext.getOrNull() == null) {
startKoin {
androidLogger()
androidContext(context)
modules(roomTestModule)
}
}
}
@After
fun stopKoinAfterTest() = stopKoin()
@Test
fun testMyWorker() {
val worker = TestListenableWorkerBuilder<MyWorker>(context).build()
runBlocking {
val result = worker.doWork()
assertThat(result, `is`(Result.success()))
}
}
}
我的Koin
testDatabase模块类似于此:-
val roomTestModule = module {
single {
Room.inMemoryDatabaseBuilder(androidApplication(), MyDatabase::class.java)
.allowMainThreadQueries()
.addCallback(object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
Timber.e("In Memory")
}
})
.build()
}
}
但是,注入到Worker中的数据库版本始终是基于磁盘的版本。
我的工人类似于这个:-
class MyWorker(val context: Context, val params: WorkerParameters) :
CoroutineWorker(context, params),
KoinComponent {
internal val service: MyService by inject()
internal val database: MyDatabase by inject()
override suspend fun doWork(): Result = coroutineScope {
withContext(Dispatchers.IO) {
}
}
}
我如何将我的内存数据库注入我的工作人员进行测试?
您可以使用自定义WorkerFactory
(https://developer.android.com/reference/androidx/work/WorkerFactory)创建Worker的实例。这样,您可以让Koin
在调用doWork()
之前注入依赖项。
要使用自定义WorkerFactory
,您需要使用以下API:https://developer.android.com/reference/androidx/work/Configuration.Builder#setWorkerFactory(androidx.work.WorkerFactory)