簡體   English   中英

Akka演員使用Scala進行單元測試

[英]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
}

使用SuccessFailure導入scala.util._scala.util.{Success, Failure}

是最新版本2.2-M3的官方文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM