首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MockK -左匹配器的匹配模拟签名失败:[any(),any()]

MockK -左匹配器的匹配模拟签名失败:[any(),any()]
EN

Stack Overflow用户
提问于 2021-03-03 10:54:12
回答 3查看 14.7K关注 0票数 9

我想实现一些UI测试,以确保今天实现的代码为明天工作,但是当试图查看是否已经在过去实现的UI测试时,它会抛出以下错误:

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

这发生在every {} return Unit行上,其中有一个名为WakeUpTimeManager的对象文件,调用.set(param1,param2)函数,而在该函数中有一些内联函数,我认为这可能会导致问题,但我不知道。我试着在网上搜索,但找不到解决办法。

下面是抛出错误的测试:

代码语言:javascript
运行
复制
  @Before
  fun setup() {
    mockkObject(WakeUpTimerManager)
    every { WakeUpTimerManager.set(any(), any()) } returns Unit
  }

下面是调用every行的函数

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

问题:为什么要抛出这个错误?到底怎么回事?有什么解决办法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-15 05:40:57

试着用mockkStatic(WakeUpTimerManager::class)。对我来说,mockkObject也没有工作,但mockkStatic工作了。

票数 7
EN

Stack Overflow用户

发布于 2022-03-31 22:33:50

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

代码语言:javascript
运行
复制
// 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会有帮助,但在我的情况下就不行了。

代码语言:javascript
运行
复制
// val message = mockk<Message>()
// every { Message() } returns message
// verify { viewModel.show(message) }

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

代码语言:javascript
运行
复制
mockkStatic(ViewExtension::class.java.name + "Kt") // Like "com.example...ViewExtensionKt"

然后模拟一个behaviour

代码语言:javascript
运行
复制
every { viewModel.show(Message()) } just Runs
verify { viewModel.show(any() as Message) }
票数 2
EN

Stack Overflow用户

发布于 2022-06-21 09:00:51

在我的例子中,我使用了错误的注释来模拟依赖项。

我使用的是来自@MockBeanorg.springframework.boot.test.mock.mockito.MockBean,而我应该使用来自com.ninjasquad.springmockk.MockkBean@MockkBean

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66455570

复制
相关文章

相似问题

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