9

我对 Scala 还很陌生,所以请保持温和。

在我目前正在构建的应用程序中,我正在使用 Akka 演员,我想编写一些单元测试。我遇到了这个为 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 演员的这个例子

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)

,诚然,这可能是旧的,但它很容易理解并且更接近我想使用 Futures 时通常使用的内容,并且最重要的是有效。它确实需要我声明一些隐式,如 ActorSystem、超时等,而官方方式似乎并非如此......

如果可能的话,我想使用官方文档提出的方法,所以如果有人能帮助我理解它是如何工作的(特别是 Success 位)以及如何使用它,我将不胜感激。

4

3 回答 3

13

您的问题的答案可能太长了,因为不可能知道您实际了解多少 Scala。我会尽量让我的答案尽可能简短,但随时要求澄清。我也代表整个 stackoverflow 社区道歉,因为在提问之前明显缺乏技能,让你觉得有必要道歉。

在 Scala 2.10Try中引入了 的概念。它与 非常相似OptionOption是处理nulls 的概念。type 的值Option可以采用两种形式:Some(value)None。当您有一个Optional 值时,您可以对其进行模式匹配以查看它是 aSome还是 a None,然后采取相应的行动。模式匹配发生在 Scala 的许多地方,其中之一是在vals 的初始化期间。这里有几个例子:

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是处理异常的概念。type 的值Try可以采用两种形式:Success(result)Failure(throwable)。当您有一个类型的值时,Try您可以对其进行模式匹配以查看它是 aSuccess还是 a Failure

这就是您的代码中发生的情况(模式匹配 on Success)。相比之下,Option这两种形式Try默认不在作用域内,这会导致编译错误。这将解决它:

import scala.util.{Try, Success, Failure}
于 2013-05-28T09:26:11.117 回答
5

让您的测试扩展 TestKit,然后添加“with ImplicitSender”,然后您可以执行以下操作:

val yourActor = system.actorOf(Props[MyActor])
yourActor ! Say42
expectMsg(42)
于 2013-05-28T09:30:46.293 回答
4

首先,在期货价值上使用 get 不是一个好的模式,如果失败,这可能会引发异常。您应该使用 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 的官方文档。

于 2013-05-28T09:28:00.710 回答