2014-03-25 91 views
2

我有一個阿卡演員:如何測試akka演員中的公共方法?

class MyActor extends Actor { 
    def recieve { ... } 

    def getCount(id: String): Int = { 
    //do a lot of stuff 
    proccess(id) 
    //do more stuff and return 
    } 
} 

我試圖創建利用getCount方法的單元測試:

it should "count" in { 
    val system = ActorSystem("Test") 
    val myActor = system.actorOf(Props(classOf[MyActor]), "MyActor") 

    myActor.asInstanceOf[MyActor].getCount("1522021") should be >= (28000) 
} 

但它不工作:

java.lang.ClassCastException: akka.actor.RepointableActorRef cannot be cast to com.playax.MyActor 

怎麼可能我測試這種方法?

回答

7

做這樣的事情:

import org.scalatest._ 
import akka.actor.ActorSystem 
import akka.testkit.TestActorRef 
import akka.testkit.TestKit 

class YourTestClassTest extends TestKit(ActorSystem("Testsystem")) with FlatSpecLike with Matchers { 

    it should "count plays" in { 
    val actorRef = TestActorRef(new MyActor) 
    val actor = actorRef.underlyingActor 
    actor.getCount("1522021") should be >= (28000) 
    } 
} 
5

我一般建議融通是由演員執行到被作爲一個構造函數參數提供或通過一個蛋糕組件提供一個單獨的類中的任何「商業邏輯」。這樣做可以簡化Actor,只保留保護長時間可變狀態和處理傳入消息的責任。它還有助於測試業務邏輯(通過單獨提供單元測試)以及Actor如何與該邏輯進行交互,通過在測試Actor自身時提供模擬/間諜實例或組件。

+0

這也是一個很好的答案,但並非總是可行。例如,我的'PersistentActor'子類的重寫'persistenceId'方法。要測試該方法,您需要基礎演員。 –