簡體   English   中英

MockK - 左匹配器的匹配模擬簽名失敗:[any(), any()]

[英]MockK - Failed matching mocking signature for left matchers: [any(), any()]

我想實施一些 UI 測試以確保今天實施的代碼適用於明天,但是當試圖查看過去實施的 UI 測試是否有效時,它會拋出此錯誤:

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

這發生在every {} return Unit行上,其中有一個名為 WakeUpTimeManager 的對象文件,它調用 a.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 會拋出這個錯誤? 這是怎么回事? 有什么解決辦法嗎?

嘗試mockkStatic(WakeUpTimerManager::class) 對我來說mockkObject也沒有工作,但mockkStatic做到了

您可以檢查您的注釋@ExtendWith是否正在使用MockKExtension

@ExtendWith(MockKExtension::class)

確保您也將MockK用於您的模擬,我在從Mockito轉換為MockK時遇到了同樣的問題。

就我而言,我對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()) }

也許 mocking 的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"

然后模擬一個行為

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

就我而言,我對 mocking 依賴項使用了錯誤的注釋。

我正在使用來自org.springframework.boot.test.mock.mockito.MockBean@MockBean ,而我應該使用來自@MockkBeancom.ninjasquad.springmockk.MockkBean

有時,尤其是對於 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM