我想测试我的一个akka演员,它使用光滑来从数据库中获取信息。在我的演员中我有这段代码
CardStationPermissions.retrieveByStationID(stationID).foreach(card => {
我想知道如何模拟该函数来更改输出而不是转发数据库中的什么?
答案 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)))
}
}
}