我认为你不能做这样的事情
testProbe.expectApproxMsg(UserInfo(`username`, `score`, _))
因为,第一个最后一个属性(时间戳)不是var
一个val
需要有值的,如果你想要的是通过参数传递一个模式,你也不能,因为我们不能在没有所有case
替代方案的情况下单独传递模式(PartialFunction)。
所以UserInfo(
用户名,
分数, _)
是一个对象,一个普通的实例。
但是我们可以做一个解决方法,扩展TestProbe
类并为最后一个 UserInfo 的属性类添加一个默认值。
看看以下,也许它对你有用:
HelloSpec.scala
import org.scalatest._
import scala.concurrent.duration._
import akka.testkit._
import akka.testkit._
import akka.actor._
case class UserInfo(username: String, score: Int, timestamp: String = "")
case class MyTestProbe(_application: ActorSystem) extends TestProbe(_application) {
def expectApproxMsg(max: Duration = Duration.Undefined, us:UserInfo):UserInfo = {
val obj = receiveOne(max).asInstanceOf[UserInfo]
assert(obj ne null, s"timeout ($max) during expectMsg while waiting for $us")
val expect = us.username == obj.username && us.score == obj.score
assert(expect, s"expected $us, found $obj")
obj
}
}
class HelloSpec extends FlatSpec with Matchers with TestKitBase {
implicit lazy val system = ActorSystem()
"TestProbe actor" should "receive correct message" in {
val probe2 = MyTestProbe(system)
probe2.ref ! UserInfo("Salc2",9999,"whatever")
probe2.expectApproxMsg(500 millis, UserInfo("Salc2",9999))
}
}
测试包源代码