首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >io.mockk.MockKException: SignedCall的匹配模拟签名失败

io.mockk.MockKException: SignedCall的匹配模拟签名失败
EN

Stack Overflow用户
提问于 2021-08-24 09:09:49
回答 1查看 2.3K关注 0票数 4

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

我做了几次工作单元测试。昨天我正在测试我实现的特性。但是,每当我试图运行测试时,就会出现这样的异常:

代码语言:javascript
运行
复制
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会记录这些错误:

代码语言:javascript
运行
复制
[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

代码只是一个简单的调用检查,下面是一个示例:

代码语言:javascript
运行
复制
 @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 (从北极福克斯回滚)

EN

回答 1

Stack Overflow用户

发布于 2022-06-08 21:24:52

我偶尔会遇到这样的情况:

  1. 你是验证对象而不是模拟/间谍
  2. 内部onChanged可能会碰到内联函数或在其他情况下是内联函数本身。
  3. 请求的any()对象具有抽象类型参数。
  • (即MyObject<T>,与调用any<MyObject<T>>()相同)

解决方案

  1. 确保正确地调用模拟或间谍对象。
  2. 解决不了
  3. 如果可能的话,调整您的生产代码以直接访问T。
  • (即verify { mock.method(any<T>()) })
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68904766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档