Мокк Пропущенные звонки внутри каждого блока {...} - PullRequest
0 голосов
/ 20 ноября 2018

Я застрял, пытаясь смоделировать некоторые вещи с помощью mockk:

У меня есть следующая настройка на gradle

root:
  |-- App (just a sample app for the SDK)
  |-- SDK (SDK we develop) << apply plugin: 'com.android.library'
       |-- SDKimpl.kt
  |-- Foo (wrapper around a .jar library) << apply plugin: 'com.android.library'
       |-- Foo.kt

Так что я пишу androidTest для SDK ипытаюсь издеваться Foo.kt.В классе Foo нет ничего необычного, просто прямое class Foo(private val someParams) {

Так что, используя androidTestImplementation "io.mockk:mockk-android:1.8.13", макет выглядит так:

val mock: Foo = mockk()
// val mock: Foo = mockkClass(Foo::class) // also tried this
every { mock.getData() } returns listOf("1", "2", "3")

Я всегда получаю следующее падение:

io.mockk.MockKException: Missing calls inside every { ... } block.
at io.mockk.impl.recording.states.StubbingState.checkMissingCalls(StubbingState.kt:14)
at io.mockk.impl.recording.states.StubbingState.recordingDone(StubbingState.kt:8)
at io.mockk.impl.recording.CommonCallRecorder.done(CommonCallRecorder.kt:42)

Также пытался просто собрать информацию:

  • , работающий внутри тестовой папки JVM.Он бездействует, но я не могу запустить свой тест как JVM
  • , работающий androidTest внутри Foo модуля.Получил тот же сбой
  • , используя mockkClass (Foo :: class).Произошел сбой
  • с использованием аннотаций @MockK и MockKAnnotations.init(this).Произошел некоторый сбой.
  • добавлено Log.d перед строкой every { и внутри метода getData(), и кажется, что настоящий реальный метод из класса вызывается во время настройки макета.Это кажется мне очень странным.

Есть идеи, что здесь не так?

edit:

по запросу, полный код.В настоящее время я работаю над изолированным проектом, чтобы попытаться изолировать ошибку, поэтому Foo просто:

class Foo {

    fun getData(): String {
        Log.d(TAG, "invoked foo.getData()")
        return "trolololo"
    }

}

, а затем у меня FooTest в androidTest:

class FooTest {

    @Test
    fun mock_foo() {
        val foo = mockk<Foo>()
        every { foo.getData() } returns "zero"
        assertEquals("zero", foo.getData())
    }

}

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Попробуйте проверить официальное руководство и посмотрите, чего не хватает.

В моем случае я попытался смоделировать расширение в Kotlin, но пропустил mockkStatic

fun Date.asMyTime() : DateTime = DateTime(this, DateTimeZone.getDefault())

mockkStatic("packageName.FileNameKt") // This is what I was missing
every {
    DateTime().asMyTime()
} returns mock(DateTime::class.java)
0 голосов
/ 24 декабря 2018

Кажется, это открытый вопрос Mockk: https://github.com/mockk/mockk/issues/182

2 возможных быстрых исправления ( выберите один ):

  1. Запустите инструментальные тесты вэмулятор> = Android-P
  2. Установить Foo открытый класс (и метод (ы), который вы хотите смоделировать тоже)
...