首页 > 解决方案 > SignedCall Mockk 的匹配模拟签名失败

问题描述

我有一个最近从 java 转换为 kotlin 的类,现在我的一个单元测试无法编译。

这是导致它的行:

    mockkStatic(PhoneNumberSelectionActivity::class)
    every {
        PhoneNumberSelectionActivity.startActivity(
            mockActivity,
            any(),
            any()
        )
    } returns Unit

我的堆栈跟踪:

SignedCall 的匹配模拟签名失败(retValue=java.lang.Void@7a5aa8c5, isRetValueMock=false, retType=class java.lang.Void, self=TNActivityBase(mockActivity#1), method=startActivity(Intent), args=[null ], invocationStr=TNActivityBase(mockActivity#1).startActivity(null)) 左匹配器:[any(), any()]

io.mockk.MockKException:SignedCall 匹配模拟签名失败(retValue=java.lang.Void@7a5aa8c5,isRetValueMock=false,retType=class java.lang.Void,self=TNActivityBase(mockActivity#1),method=startActivity(Intent ), args=[null], invocationStr=TNActivityBase(mockActivity#1).startActivity(null)) 左匹配器:[any(), any()]

PhoneNumberSelectionActivity 类继承自 TNActivityBase。

这是我们试图在 PhoneNumberSelectionActivity 中模拟的函数:

    fun startActivity(
        host: Activity,
        phoneExpired: Boolean,
        @ACTIVITY_HOST_TYPE activityHostType: Int
    ) {
        if (sIsRunning) {
            return
        }
        sIsRunning = true
        val intent = Intent(host, PhoneNumberSelectionActivity::class.java)
        intent.putExtra(EXTRA_ACTIVITY_HOST_TYPE, activityHostType)
        if (phoneExpired) {
            intent.putExtra(EXTRA_SHOW_PHONE_EXPIRE_DIALOG, true)
        }
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
        host.startActivity(intent)
    }

在我看来,mockkStatic 没有完成它的工作。想法?

标签: androidstaticmockk

解决方案


Mockk 显然不支持无符号类型。

与 UByteArray 但不与 ByteArray 匹配模拟签名失败

所以我做了:

    every {
        PhoneNumberSelectionActivity.startActivity(
            mockActivity,
            true,
            PhoneNumberSelectionActivity.ACTIVITY_HOST_TYPE.AUTHORIZATION
        )
    } returns Unit

推荐阅读