Android инструментальный тест зависает, когда он проверяет функцию приостановки, которая использует RoomDatabase.withTransaction - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь протестировать следующую функцию LocalDataSource, NameLocalData.methodThatFreezes , но она зависает. Как я могу это решить? Или как я могу протестировать его другим способом?

Класс для тестирования

class NameLocalData(private val roomDatabase: RoomDatabase) : NameLocalDataSource {

  override suspend fun methodThatFreezes(someParameter: Something): Something {
    roomDatabase.withTransaction {
      try {
        // calling room DAO methods here
      } catch(e: SQLiteConstraintException) {
        // ...
      }
      return something
    }
  }
}

Тестовый класс

@MediumTest
@RunWith(AndroidJUnit4::class)
class NameLocalDataTest {
  private lateinit var nameLocalData: NameLocalData

  // creates a Room database in memory
  @get:Rule
  var roomDatabaseRule = RoomDatabaseRule()

  @get:Rule
  var instantTaskExecutorRule = InstantTaskExecutorRule()

  @Before
  fun setup() = runBlockingTest {
     initializesSomeData()
     nameLocalData = NameLocalData(roomDatabaseRule.db)
  }

 @Test
 fun methodThatFreezes() = runBlockingTest {
    nameLocalData.methodThatFreezes // test freezes
 }

 // ... others NameLocalDataTest tests where those functions been tested does not use
 // roomDatabase.withTransaction { } 
}

Конфигурация файлов Gradle

espresso_version = '3.2.0'
kotlin_coroutines_version = '1.3.3'
room_version = '2.2.5'

test_arch_core_testing = '2.1.0'
test_ext_junit_version = '1.1.1'
test_roboletric = '4.3.1'
test_runner_version = '1.2.0'

androidTestImplementation "androidx.arch.core:core-testing:$test_arch_core_testing"
androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version"
androidTestImplementation "androidx.test.ext:junit:$test_ext_junit_version"
androidTestImplementation "androidx.test:rules:$test_runner_version"
androidTestImplementation "androidx.test:runner:$test_runner_version"
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlin_coroutines_version"

1 Ответ

1 голос
/ 07 мая 2020

В прошлый раз, когда я написал тест для базы данных Room, я просто использовал runBlock, и он сработал для меня ... Не могли бы вы взглянуть на этот образец и проверить, работает ли он и для вас ?

Изменить: Опс! Я пропустил эту часть ... Я попробовал это (в том же примере):

  1. Я определил фиктивную функцию в моем DAO, используя @Transaction
@Transaction
suspend fun quickInsert(book: Book) {
    save(book)
    delete(book)
}
Думаю, это ключ к проблеме. Добавьте setTransactionExecutor в экземпляр своей базы данных.
appDatabase = Room.inMemoryDatabaseBuilder(
    InstrumentationRegistry.getInstrumentation().context,
    AppDatabase::class.java
).setTransactionExecutor(Executors.newSingleThreadExecutor())
    .build()
Наконец, тест работал с использованием runBlocking
@Test
fun dummyTest() = runBlocking {
    val dao = appDatabase.bookDao();
    val id = dummyBook.id

    dao.quickInsert(dummyBook)

    val book = dao.bookById(id).first()
    assertNull(book)
}

См. этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...