io.mockk.MockKException:无法为 SignedCall 匹配模拟签名

问题描述 投票:0回答:1

我在运行模拟测试时遇到问题(使用 mockK 和 Kotlin)。

我有几个工作单元测试。昨天我正在测试我实现的功能。但是每当我尝试运行测试时,都会出现此异常:

io.mockk.MockKException: Failed matching mocking signature for
SignedCall(retValue=, isRetValueMock=true, retType=class kotlin.Unit, self=Observer(#1), method=onChanged(Any), args=[kotlin.Unit], invocationStr=Observer(#1).onChanged(kotlin.Unit))
left matchers: [any()]

    at io.mockk.impl.recording.SignatureMatcherDetector.detect(SignatureMatcherDetector.kt:99)
    at io.mockk.impl.recording.states.RecordingState.signMatchers(RecordingState.kt:39)
    at io.mockk.impl.recording.states.RecordingState.round(RecordingState.kt:31)

此外,如果我尝试使用覆盖率运行测试,android studio 会记录这些错误:

[2021.08.24 12:05:30] (Coverage): Error during class instrumentation: kotlin.text.Regex: java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 14
[2021.08.24 12:05:31] (Coverage): Error during class instrumentation: kotlin.text.StringsKt___StringsKt: java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 14
[2021.08.24 12:05:31] (Coverage): Error during class instrumentation: kotlin.text.StringsKt__StringsKt: java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 14
[2021.08.24 12:05:31] (Coverage): Error during class instrumentation: kotlin.text.StringsKt__StringsJVMKt: java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 14
[2021.08.24 12:05:31] (Coverage): Error during class instrumentation: kotlin.text.StringsKt__StringNumberConversionsJVMKt: java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 14

代码只是一个简单的调用检查,这里有一个例子:

 @Test
    fun onLoginButtonPressed() {
        // Arrange
        val tObserver: Observer<Unit> = mockk(relaxUnitFun = true)
        viewModel.launchLoginScreenEvent.observeForever(tObserver)

        // Act
        viewModel.onLoginButtonPressed()

        // Assert
        verify(exactly = 1) { tObserver.onChanged(any()) }
    }

我不知道这两个问题是否相关,但在我的案例中它们是一起出现的。

Kotlin 版本:1.4.31 Android Studio:4.2(从 Arctic Fox 回滚)

android kotlin code-coverage mockk
1个回答
2
投票

我偶尔遇到的可能情况:

  1. 你正在 验证对象而不是模拟/间谍

  2. 内部 onChanged 可能命中内联函数 或者在其他情况下是内联函数本身

  3. 被请求的

    any()
    对象有一个抽象类型参数。

  • (即
    MyObject<T>
    与调用
    any<MyObject<T>>()
    相同)

解决方案

  1. 确保正确调用模拟或间谍对象
  2. 没办法解决
  3. 如果可能,调整您的生产代码以直接访问 T.
  • (即
    verify { mock.method(any<T>()) }
© www.soinside.com 2019 - 2024. All rights reserved.