【问题标题】:Mocking out all overlaoded versions of a method in scala mockito在 scala mockito 中模拟方法的所有重载版本
【发布时间】:2019-10-21 14:48:59
【问题描述】:

Mockito-Scala 中,您可以像这样删除方法:

myMock.doIt(*) returns 1
myMock.doIt(*,*) returns 1
myMock.doIt(*,*)(*) returns 1

有没有办法一次模拟所有重载的方法?

【问题讨论】:

  • 如果没有使用 scala-mockito,我有根据的猜测是否定的。重载的方法只是具有相同名称的方法,它们仍然是不同的方法(不同的签名)。如果不大量使用反射,就无法模拟所有重载方法。

标签: scala mockito-scala


【解决方案1】:

ScalaAnswer[T] 可用于像这样配置模拟的答案

object AnswerAllFoo extends ScalaAnswer[Any] {
  def answer(invocation: InvocationOnMock): Any = {
    if (invocation.getMethod.getName == "foo") 42 else ReturnsDefaults.answer(invocation)
  }
}

然后像这样在模拟创建中传递它

mock[Qux](AnswerAllFoo)

这是一个完整的工作示例

import org.mockito.invocation.InvocationOnMock
import org.mockito.stubbing.{ReturnsDefaults, ScalaAnswer}
import org.scalatest.{FlatSpec, Matchers}
import org.mockito.{ArgumentMatchersSugar, IdiomaticMockito}

trait Qux {
  def foo(s: Seq[Int]): Int
  def foo(i: Int, j: String): Int
  def bar(s: String): String
}

object AnswerAllFoo extends ScalaAnswer[Any] {
  def answer(invocation: InvocationOnMock): Any = {
    if (invocation.getMethod.getName == "foo") 42 else ReturnsDefaults.answer(invocation)
  }
}

class MockAnyOverload extends FlatSpec with Matchers with IdiomaticMockito with ArgumentMatchersSugar {
  "Answer[T]" should "should answer all overloaded methods foo" in {
    val qux = mock[Qux](AnswerAllFoo)

    qux.foo((Seq(1,0))) shouldBe (42)
    qux.foo(1, "zar") shouldBe (42)

    qux.bar(*) returns "corge"
    qux.bar("") shouldBe ("corge")
  }
}

【讨论】:

  • @Jethro 请查看编辑后的答案,因为原始实现中存在一个错误,我错过了ReturnsDefaults.answer(invocation)
猜你喜欢
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2015-12-13
相关资源
最近更新 更多