mockkStatic 和mockkObject 不会模拟Android 中的伴生对象

Kri*_*lsh 6 android kotlin mockk

我有一个非常简单的课程:

class TestClass {

    companion object {
        fun sampleFunc(value: Int): Int {
            return value + 5
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和一个非常简单的测试:

@Test
fun `test class`() {
    mockkObject(TestClass::class)
    every {
        TestClass.sampleFunc(any())
    } returns 11

    assertThat(TestClass.sampleFunc(5)).isEqualTo(11)
}
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

Failed matching mocking signature for

left matchers: [any()]
io.mockk.MockKException: Failed matching mocking signature for

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)
    at io.mockk.impl.recording.CommonCallRecorder.round(CommonCallRecorder.kt:50)
    at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:59)
    at io.mockk.impl.eval.EveryBlockEvaluator.every(EveryBlockEvaluator.kt:30)
    at io.mockk.MockKDsl.internalEvery(API.kt:92)
    at io.mockk.MockKKt.every(MockK.kt:104)
Run Code Online (Sandbox Code Playgroud)

MockK 版本:1.9.3 操作系统:mac Kotlin 版本:1.5.21 JDK 版本:11 JUnit 版本:4.12

任何想法?我也尝试过mockkStatic,结果相同。

Kri*_*lsh 16

根据这个答案:https://github.com/mockk/mockk/issues/136#issuecomment-419879755

@Test
fun `test class`() {
    mockkObject(TestClass.Companion)
    every {
        TestClass.sampleFunc(any())
    } returns 11

    assertThat(TestClass.sampleFunc(5)).isEqualTo(11)
}
Run Code Online (Sandbox Code Playgroud)

确实有效,而且确实如此。

  • 这个答案让我从两天的疲惫工作中解脱出来。谢谢 (2认同)