跨测试重用模拟声明

时间:2016-06-30 12:03:11

标签: scala scalatest

我想在测试中重用模拟声明(如果可能的话)。 这是使用ScalaTest和Mockito的最小非工作示例。我期待第一次测试中的值,但我得到其他值。

似乎最新的Mockito.when是适用于所有测试条款的那个。

有没有办法避免在每个in子句中声明模拟?

import org.mockito.Mockito._
import org.scalatest.mock.MockitoSugar
import org.scalatest.{Matchers, WordSpec}
​
class ReuseMocksSpec extends WordSpec with Matchers with MockitoSugar {

  "A test" when {
    val service = mock[Service]
    "sharing mocks among tests" should {
      when(service.getVal).thenReturn("yes")
      "get yes value" in {
        service.getVal should be("yes")
      }
    }
    "sharing mocks among other tests" should {
      when(service.getVal).thenReturn("other")
      "get other value" in {
        service.getVal should be("other")
      }
    }
  }
​
  trait Service {
    def getVal: String
  }
}

1 个答案:

答案 0 :(得分:0)

我回顾了我设计它的方式,现在正在使用一个函数来构建我的模拟:

def withValue(value: String)(body: (Service => String)) = {
  val service = mock[Service]
  when(service.getVal).thenReturn(value)
  body(service)
}

测试类将成为:

import org.mockito.Mockito._
import org.scalatest.mock.MockitoSugar
import org.scalatest.{Matchers, WordSpec}

class ReuseMocksSpec extends WordSpec with Matchers with MockitoSugar {

  "A test" when {
    "sharing mocks among tests" should {
      "get yes value" in {
        val value = withValue("yes") { service =>
          service.getVal
        }
        value should be("yes")
      }
    }
    "sharing mocks among other tests" should {
      "get other value" in {
        val value = withValue("other") { service =>
          service.getVal
        }
        value should be("other")
      }
    }
  }

  def withValue(value: String)(body: (Service => String)) = {
    val service = mock[Service]
    when(service.getVal).thenReturn(value)
    body(service)
  }

  trait Service {
    def getVal: String
  }
}

我不知道它是否是最干净,最简单的方法,但它有效......