【问题标题】:Mocking a dynamic class method argument using scalatest/mockiton使用 scalatest/mockiton 模拟动态类方法参数
【发布时间】:2017-04-19 00:53:41
【问题描述】:

这就是我模拟我的服务调用并返回虚假结果的方式:

when(myService.doSomething("",fakeRequestAsModel)) thenReturn fakeResult

val result = call(controller.myActionMethod(), request)

问题出在控制器方法myActionMethod 中,当我调用doSomething 并传递参数即时调用某些属性时,该属性只会返回生产中的某些内容...

def myActionMethod() ... = {

   myService.doSomething(request.getSomeValue,requestAsModel)
   ...
}

所以,getSomeValue 是一种我只能在生产中调用的方法,它带有一个 3rd 方库,我无法覆盖它。

我怎样才能模拟这个调用,所以request.getSomeValue 不会抛出异常?

request.getSomeValue 是动态的,不幸的是我无法将其放入配置中...

【问题讨论】:

    标签: scala mocking mockito scalatest


    【解决方案1】:
    // we rename this because Scala defines `eq` on `AnyRef`
    import org.mockito.Matchers.{eq => eqMockito, _} 
    ...
    when(myService.doSomething(anyString(), eqMockito(fakeRequestAsModel))) 
      thenReturn fakeResult
    

    在这里,我们希望 Mockito 在发送任何字符串 时返回此答案,并且准确无误 fakeRequestAsModel,这正是您想要的。


    注意事项:

    1. 注意不要将any匹配器与正常值混在一起,你不能说: when(myService.doSomething(anyString(), fakeRequestAsModel)).
      您需要使用eqMockito() 方法包装正常值。
    2. 您可以将any[classOf[T]] 用于类型参数化的参数。
    3. 请特别注意implicits

    希望对你有帮助!

    【讨论】:

    • 谢谢你!这有帮助。你能解释一下import org.mockito.Matchers.{eq => eqMockito, _}这个导入吗?主要是eq => eqMockito
    • @JohnBigs 不客气!在 Scala 中,您可以重命名 导入的内容,以避免名称冲突。例如,您想将java.util.List 称为JList 或类似的东西。在这里,我们将一个名为 eq 的方法重命名为 eqMockito(或任何您想调用的名称)。您还可以将某些内容排除在导入之外,请参阅stackoverflow.com/questions/27945005/…
    • 所以我们只更改了名称,所以它不会与 scala eq 冲突?
    • 是的,这是唯一的原因。不用它也可以随意尝试。
    猜你喜欢
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2021-01-07
    相关资源
    最近更新 更多