kotlin MockK -无法匹配左匹配器的模拟签名:[任何()、任何()]

92vpleto  于 2022-12-23  发布在  Kotlin
关注(0)|答案(4)|浏览(193)

我想实现一些UI测试,以确保今天实现的代码在明天也能工作,但是当我试图查看过去已经实现的UI测试是否工作时,它抛出了这个错误:
第一个月
这发生在every {} return Unit行,该行有一个名为WakeUpTimeManager对象文件,该文件**调用.set(param1,param2)**函数,该函数内有一些内联函数,我认为可能是这些函数导致了问题,但我不知道。我尝试在互联网上搜索,但无法找到解决方案。
下面是抛出错误的测试:

@Before
  fun setup() {
    mockkObject(WakeUpTimerManager)
    every { WakeUpTimerManager.set(any(), any()) } returns Unit
  }

下面是在every行上调用的函数

fun set(context: Context, timer: Timer) {
    if (timer.atMillis < System.currentTimeMillis()) {
      return
    }

    if (Preset.findByID(context, timer.presetID) == null) {
      return
    }

    //This is an inline function
    withGson {
      PreferenceManager.getDefaultSharedPreferences(context).edit {
        putString(PREF_WAKE_UP_TIMER, it.toJson(timer))
      }
    }

    //This is an inline function
    withAlarmManager(context) {
      it.setAlarmClock(
        AlarmManager.AlarmClockInfo(timer.atMillis, getPendingIntentForActivity(context)),
        getPendingIntentForService(context, timer)
      )
    }
  }

**问题:**为什么mockk会抛出这个错误?这是怎么回事?有什么解决方案吗?

nfeuvbwi

nfeuvbwi1#

尝试使用mockkStatic(WakeUpTimerManager::class)。对我来说,mockkObject也不工作,但mockkStatic工作

uhry853o

uhry853o2#

在我的例子中,我使用了错误的注解来模拟依赖关系。
我从org.springframework.boot.test.mock.mockito.MockBean使用@MockBean,而我应该从com.ninjasquad.springmockk.MockkBean使用@MockkBean

thigvfpy

thigvfpy3#

在我的例子中,我对any()使用了类型转换。我想测试方法viewModel.show(Message())是否被调用。但是这个方法被重载了(有不同类型的签名),所以我尝试将参数any()转换为Message

// show is overloaded method
fun show(resourceId: Int) {}
fun show(text: String) {}
fun show(message: Message) {}

// But it threw the exception.
verify { viewModel.show(any() as Message) }

// This won't work because Message() object will be different 
verify { viewModel.show(Message()) }

也许对message的嘲笑会有所帮助,但不是在我的情况下。

// val message = mockk<Message>()
// every { Message() } returns message
// verify { viewModel.show(message) }

我必须添加mockkStatic,因为我使用了扩展方法。例如,fun ViewExtension.show()

mockkStatic(ViewExtension::class.java.name + "Kt") // Like "com.example...ViewExtensionKt"

然后模拟behaviour

every { viewModel.show(Message()) } just Runs
verify { viewModel.show(any() as Message) }
nnvyjq4y

nnvyjq4y4#

有时候,尤其是在Dagger Hilt和全局测试模块中,它们会用Mockk模拟来替换对象示例,所以我们并不清楚是模拟对象还是真实的对象。对我来说,就是这样--我缺少了一个依赖项,所以真实示例没有被模拟对象替换,所以mockk回答了这个非常奇怪的错误:

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:63)
    at io.mockk.impl.eval.VerifyBlockEvaluator.verify(VerifyBlockEvaluator.kt:30)
    at io.mockk.MockKDsl.internalVerify(API.kt:119)
    at io.mockk.MockKKt.verify(MockK.kt:149)
    at io.mockk.MockKKt.verify$default(MockK.kt:140)

相关问题