Я застрял, пытаясь смоделировать некоторые вещи с помощью 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())
}
}