Как протестировать Android рабочих с базой данных In-Memory Room, введенной Коином - PullRequest
0 голосов
/ 10 февраля 2020

Мое текущее 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"

I wi sh, чтобы проверить моих работников, которым в мою базу данных Room вставлена ​​

Для я тестирую sh, чтобы внедрить версию базы данных 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, всегда основывается на диске.

My 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) {


        }
    }
}

Как я могу внедрить свою базу данных In Memory в мои рабочие для тестирования?

1 Ответ

1 голос
/ 19 февраля 2020

Вы можете использовать пользовательский WorkerFactory (https://developer.android.com/reference/androidx/work/WorkerFactory) для создания экземпляров ваших работников. Таким образом, вы можете Koin внедрить зависимости до вызова doWork().

Чтобы использовать пользовательский WorkerFactory, вам нужно использовать следующий API: https://developer.android.com/reference/androidx/work/Configuration.Builder#setWorkerFactory (androidx.work. WorkerFactory)

...