Kotlin Ошибка Mockk: пропущенные звонки внутри блока проверки {...} - PullRequest
2 голосов
/ 19 февраля 2020

Я уже читал некоторые проблемы с этим или похожим сообщением об ошибке (оно также происходит для каждого {}), но ни одно из них не привело меня к успешному результату.

Любые советы или предложения о том, как заставить это работать?

Вот мои настройки и сам модульный тест:

compileSdkVersion 29
defaultConfig {
   minSdkVersion 19
   targetSdkVersion 29
   testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

MockK version: 1.9.3.kotlin12
OS: Android
Kotlin version: 1.3.61
JDK version: jdk1.8.0_212
JUnit version: 4.12
Type of test: unit test

Отслеживание стека ошибки:

io.mockk.MockKException: Missing calls inside verify { ... } block.

    at io.mockk.impl.recording.states.VerifyingState.checkMissingCalls(VerifyingState.kt:52)
    at io.mockk.impl.recording.states.VerifyingState.recordingDone(VerifyingState.kt:21)
    at io.mockk.impl.recording.CommonCallRecorder.done(CommonCallRecorder.kt:47)
    at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:60)
    at io.mockk.impl.eval.VerifyBlockEvaluator.verify(VerifyBlockEvaluator.kt:30)
    at io.mockk.MockKDsl.internalVerify(API.kt:118)
    at io.mockk.MockKKt.verify(MockK.kt:139)
    at io.mockk.MockKKt.verify$default(MockK.kt:136)

Мой модульный тест:

@Test
fun logout_clearsDatabase() {
    coroutineTestRule.testDispatcher.runBlockingTest {

        // ARRANGE
        database.dataDao().insert(listOf(DataDummies()))

        // ACT
        sut.logout()

        // ASSERT
        verify { database.clearAllTables() }
    }
}

Понятия не имею, что я здесь не так сделал. database.clearAllTables() - это метод, предоставленный Room. testDispatcher - это TestCoroutineDispatcher(), предоставляемый библиотекой тестирования androidx.

ОБНОВЛЕНИЕ / ОТВЕТ

Благодаря вводу @Juan Cruy Soler я изменил способ впрыскивать базу данных. Я не вернул базу данных реальной комнаты, вместо этого я вернул ее шпион. Таким образом, шпион вводится в SUT, а также в мой тестовый класс. После этого изменения тест выполняется в соответствии с ожиданиями. Я это реальное решение моей проблемы? Имеет ли смысл позволить (Testing-) DependencyInjection создать шпиона?

1 Ответ

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

database должен быть ложным или шпион, чтобы позвонить, чтобы проверить его.
Я предполагаю, что это не фиктивный, потому что вы вызываете метод dataDao() в предыдущей строке.

  • Если вы не хотите имитировать использование реальной базы данных, вам следует проверить, что database.dataDao().getData() возвращает пустой список и удалить строку verify.
  • Если вы издеваетесь над ней, вы можете удалить эту строку database.dataDao().insert(listOf(DataDummies()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...