Meh*_*tei 6 junit android mockito mockk
我正在尝试在 Mockk 的帮助下为我的视图模型编写单元测试。
@Test
fun `When loading the ResponseViewState isLoading`() {
val observer = spyk<Observer<ResponseViewState>>(Observer { })
puppiesViewModel.status_.observeForever(observer)
every {
fetchPuppiesUseCase.fetchPuppies()
} returns
Observable.just(Resource.Loading)
puppiesViewModel.fetchPuppies()
val slot = slot<ResponseViewState>()
verify { observer.onChanged(capture(slot)) }
assert(slot.captured.isLoading())
verify { fetchPuppiesUseCase.fetchPuppies() }
}
Run Code Online (Sandbox Code Playgroud)
当我通过间谍创建观察者时发生错误。
val observer = spyk<Observer<ResponseViewState>>(Observer { })
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
java.lang.NoClassDefFoundError: com/example/tink/PuppiesViewModelTest$$Lambda$61/0x0000000800176840
at jdk.internal.reflect.GeneratedSerializationConstructorAccessor4.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:48)
at io.mockk.proxy.jvm.ObjenesisInstantiator.instanceViaObjenesis(ObjenesisInstantiator.kt:75)
at io.mockk.proxy.jvm.ObjenesisInstantiator.instance(ObjenesisInstantiator.kt:42)
at io.mockk.proxy.jvm.ProxyMaker.instantiate(ProxyMaker.kt:75)
at io.mockk.proxy.jvm.ProxyMaker.proxy(ProxyMaker.kt:42)
at io.mockk.impl.instantiation.JvmMockFactory.newProxy(JvmMockFactory.kt:34)
at io.mockk.impl.instantiation.AbstractMockFactory.newProxy$default(AbstractMockFactory.kt:29)
at io.mockk.impl.instantiation.AbstractMockFactory.spyk(AbstractMockFactory.kt:102)
at com.example.tink.PuppiesViewModelTest.createObserver(PuppiesViewModelTest.kt:99)
at com.example.tink.PuppiesViewModelTest.given loading state, when fetchPuppies called, then isLoading return true(PuppiesViewModelTest.kt:40)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
Caused by: java.lang.ClassNotFoundException: com.example.tink.PuppiesViewModelTest$$Lambda$61.0x0000000800176840
Run Code Online (Sandbox Code Playgroud)
知道如何修复或者更好的测试方法吗?
该更改似乎与 Kotlin 有关,并且是在 1.5 版本中进行的。更改KT-44912与 Kotlin 编译器如何生成实现 SAM 接口的匿名类有关。
您可以通过将 Kotlin 版本更改为 1.4.32(最新的 1.4.X)来轻松测试这一点。
一个简单的解决方案是将您的代码更改为以下内容:
Run Code Online (Sandbox Code Playgroud)val observer = createMockObserver()
Run Code Online (Sandbox Code Playgroud)@Suppress("ObjectLiteralToLambda") fun createMockObserver(): Observer<ResponseViewState> { val observer = object : Observer<ResponseViewState> { override fun onChanged(t: ResponseViewState?) { } } return spyk<Observer<ResponseViewState>>(observer) }
build.gradle或者,您可以通过将以下内容添加到块下来强制 Kotlin 编译器使用 1.5 之前的匿名类生成android:
Run Code Online (Sandbox Code Playgroud)afterEvaluate { compileDebugUnitTestKotlin { kotlinOptions { freeCompilerArgs += [ '-Xsam-conversions=class', ] } } }
| 归档时间: |
|
| 查看次数: |
2436 次 |
| 最近记录: |