Scala:我如何使用Mockito模拟此功能?

时间:2014-07-01 20:52:09

标签: scala akka mockito

我想测试我的一个akka演员,它使用光滑来从数据库中获取信息。在我的演员中我有这段代码

CardStationPermissions.retrieveByStationID(stationID).foreach(card => {

我想知道如何模拟该函数来更改输出而不是转发数据库中的什么?

1 个答案:

答案 0 :(得分:1)

以静态方式模拟被调用的东西真的很困难(在这种情况下,调用object而不是class的实例)。当你需要能够模拟和测试这样的事情时,我倾向于同意Mustafa的建议,即创建一个特征来表示相关的模拟方法。一个简单的例子如下:

case class MyObject(id:Long)
trait MyDao{
  def getData(input:String):List[MyObject] = ...
}
object MyDao extends MyDao

class MyActor extends Actor{
  val myDao:MyDao = MyDao

  def receive = {
    case param:String => sender ! myDao.getData(param)
  }
}

在这里你可以看到我有一个特征来表示我的dao方法(本例中只有1个)然后我将该特征混合到一个scala对象中作为该特征的默认实例。当我在我的演员中设置我的dao时,我明确地将其输入到特征中,以便我可以在以后替换该特征的模拟impl。

那么如果我想要一个显示模拟的简单测试,它可能看起来像这样(通过specs2):

class MyActorTest(_system:ActorSystem) extends TestKit(_system) 
  with Specification with Mockito with ImplicitSender{

  def this() = this(ActorSystem("test"))

  trait scoping extends Scope{
    val mockDao = mock[MyDao]
    val actor = TestActorRef(new MyActor{
      override val myDao = mockDao
    })
  }

  "A request to get data" should{
    "pass the input to the dao and return the result to the sender" in new scoping{
      mockDao.getData("foo") returns List(MyObject(1))
      actor ! "foo"
      expectMsg(List(MyObject(1)))
    }
  }
}