使用mockito + specs2模拟返回类型的默认值

时间:2015-02-04 20:22:47

标签: scala playframework mockito specs2

给出一个模拟:

val myMock = mock[SomeClass]

我正在尝试设置它,以便模拟返回各种类型的默认值。例如。对于返回String的内容,它将返回""

我发现RETURNS_SMART_NULLS看起来像是适用于像String这样的基本返回类型。以下是我在Scala / Specs2中使用它的方法:

val myMock = mock[SomeClass].settings(smart = true)

现在问题:因为我使用Scala,我的代码/ API不返回空值但返回Option值。所以我要做的是让mock默认返回Option返回类型的非null值:None(首选)或Some[T]其中T是容器中的类型(如果它的字符串,然后是Some(""))。

例如,如果SomeClass的属性address属于Option[String],那么如何在调用None时将mockito配置为返回myMock.address而不是null 。这些空值导致下游错误。

注意,是一个可行的解决方案,我可以专门模拟这些个别调用的每个的行为(例如:myMock.address returns None

1 个答案:

答案 0 :(得分:2)

我能够测试这个课程:

class Timers(i: Int, s: String) {
  def returnOption: Option[Int] = Some(i)
  def returnString: String = s
}

进行此测试:

import org.specs2.mutable.Specification
import org.junit.runner.RunWith
import org.specs2.runner.JUnitRunner
import org.mockito.Mockito._
import org.mockito.stubbing.Answer
import org.mockito.invocation.InvocationOnMock

@RunWith(classOf[JUnitRunner])
class TimersSpec extends Specification {

  val m = mock(classOf[Timers], new Answer[Any]() {
        def answer(inv: InvocationOnMock) = {
          inv.getMethod.getReturnType match {
            case c if c == classOf[Option[_]] => None
            case c if c == classOf[String] => ""
            case _ => null
          }
        }
      })

  "A mock timer" should {
    "return a None" in {     
      m.returnOption must beNone
    }
    "return a empty string" in {
      m.returnString mustEqual ""
    }
  }
}