В моем проекте Android Kotlin у меня есть класс с функцией, запускающей сопрограмму, которую я хочу протестировать с помощью инструментального теста (не модульного теста).
Вот как это выглядит:
class DemoClass
{
fun demo(liveData: MutableLiveData<String>)
{
CoroutineScope(IO).launch {
val result = doStuff()
withContext(Main) { liveData.value = result }
}
}
}
В моем инструментальном тестовом классе я пробовал следующее:
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest
{
@ExperimentalCoroutinesApi
@Test
fun testCoroutine() = runBlockingTest {
val demoClass = DemoClass()
val liveData = MutableLiveData<String>()
demoClass.demo(liveData)
assertEquals("demo", liveData.value)
}
}
К сожалению, это не работает. Похоже, что runBlockingTest {}
доступен только для модульного тестирования, а не для инструментального тестирования. Вот моя ошибка при запуске теста:
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlinx/coroutines/test/TestBuildersKt;
Итак, как я могу проверить DemoClass.demo()
и значение liveData
в инструментальном тесте?
Спасибо.
ИЗМЕНИТЬ
Я также пробовал это:
@ExperimentalCoroutinesApi
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest
{
private val testDispatcher = TestCoroutineDispatcher()
@Before
fun setup() {
Dispatchers.setMain(testDispatcher)
}
@After
fun tearDown() {
Dispatchers.resetMain()
testDispatcher.cleanupTestCoroutines()
}
@Test
fun testCoroutine(): Unit = runBlocking {
val demoClass = DemoClass()
val liveData = MutableLiveData<String>()
demoClass.demo(liveData)
assertEquals("demo", liveData.value)
}
}
Тест работает, но я получил это:
java.lang.AssertionError:
Expected :demo
Actual :null