[英]Akka actors unit testing with Scala
我對Scala很新,所以請保持溫柔。
在我正在構建的應用程序中,我正在使用Akka actor,我想編寫一些單元測試。 我找到了為Akka演員編寫單元測試的官方文檔
但我無法確切地知道它應該如何運作。 特別是,
val actorRef = TestActorRef(new MyActor)
// hypothetical message stimulating a '42' answer
val future = actorRef ? Say42
val Success(result: Int) = future.value.get
result must be(42)
當我嘗試這個時,我not found: value Success
,這並不奇怪。
然后我找到了如何測試Scala actor的示例
val actorRef = TestActorRef[TickTock]
implicit val timeout = Timeout(5 seconds)
val future = (actorRef ? new Tick("msg")).mapTo[String]
val result = Await.result(future, timeout.duration)
Assert.assertEquals("processed the tick message", result)
誠然,這可能是舊的,但它很容易理解,更接近我通常使用的時候,我想使用期貨,最重要的是工作。 它確實需要我聲明一些像ActorSystem,超時等這樣的暗示,這似乎不是官方方式的情況......
如果可能的話,我想使用官方文檔提出的方法,所以如果有人能幫助我了解它是如何工作的(尤其是Success位)以及如何使用它,我將不勝感激。
你的問題的答案可能太長了,因為你不可能知道你實際知道多少Scala。 我會盡量縮短答案,但不要猶豫,隨時要求澄清。 我還代表整個stackoverflow社區道歉,因為在提出問題之前由於明顯缺乏技能而讓您覺得需要道歉。
在Scala 2.10中引入了Try
的概念。 它與Option
非常相似。 Option
是處理null
s的概念。 Option
類型的值可以采用兩種形式: Some(value)
或None
。 如果您有Option
al值,則可以對其進行模式匹配,以查看它是Some
還是None
,然后相應地執行操作。 模式匹配發生在Scala的許多地方,其中一個是在val
s初始化期間。 以下是一些例子:
val x = 10 // pattern 'x' on the LHS matches any value on the RHS so 'x' is initialized with 10
val Some(x) = Some(10) // pattern 'Some(x)' on the LHS matches any value of type 'Some' and binds it's value to x, so 'x' is yet again initialized with 10
Try
是處理異常的概念。 Try
類型的值可以采用兩種形式: Success(result)
或Failure(throwable)
。 當您具有Try
類型的值時,您可以對其進行模式匹配,以查看它是Success
還是Failure
。
這是您的代碼中發生的事情( Success
模式匹配)。 與Option
相反,默認情況下,兩種形式的Try
不在范圍內,這會導致編譯錯誤。 這將解決它:
import scala.util.{Try, Success, Failure}
讓你的測試擴展TestKit,然后添加“with ImplicitSender”然后你可以做以下事情:
val yourActor = system.actorOf(Props[MyActor])
yourActor ! Say42
expectMsg(42)
首先,使用獲取期貨價值並不是一個好的模式,如果出現故障,這可能會引發異常。 您應該使用Await.result,就像在秒示例中一樣,或者使用模式匹配來處理成功和失敗:
future match {
case Success(value) => // work with value
case Failure(ex) => // work with exception
}
使用Success
和Failure
導入scala.util._
或scala.util.{Success, Failure}
這是最新版本2.2-M3的官方文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.