Akka BehaviorTestKit -检查特定类型的匿名演员,忽略顺序



我正在尝试使用Akka BehaviorTestKit来验证是否生成了特定类型的匿名actor。

我尝试使用:

testKit.expectEffectType[SpawnedAnonymous[MyActor.Request]]

当我这样做时,我得到了AssertionError,因为在我正在测试的效果之前有其他效果。看起来,expectEffectType()只按照效果发生的顺序查看效果。我想忽略任何其他先前的效果,只关心我正在测试的效果发生在某个点上。依赖特定的其他先验效应会使测试变脆。

所以,我换了档,试了一下:

val effects: Seq[Effect] = testKit.retrieveAllEffects()
assert(!effects.filter(effect => effect.isInstanceOf[SpawnedAnonymous[Behavior[MyActor.Request]]]).isEmpty)

结果证明这不是一个有效的测试。它总是成功的,不管我检查的行为类型,由于JVM泛型类型擦除。

我如何验证特定类型的匿名参与者在任何时间点被生成?

是的,这是个问题。你有两个选择

val spawned = effects.find{case _: SpawnedAnonymous[_] => true ...}
spawned.ref ! someMessageThatWillHaveAKnownEffect

还是……如https://doc.akka.io/docs/akka/current/typed/testing-sync.html

所示

与其他参与者的交互必须存根。

这不是明确的,但对我来说,部分意义是你不能让行为由被测试的参与者定义。所以与其ctx.spawn(Behaviors.supervise[MyActor.Request](Behavior(args)).onFailure(...)),我将用

构造MyActor
trait MyActorConstructors {
   def requestHandler(args): Behavior[MyActor.Request]
}

然后调用ctx.spawn(constructors.requestHandler(args))

当您构造MyActor时,您传入了标准实现,并且从您的测试中传入了模拟参与者。这样就可以很容易地确定effects.contains(SpawnedAnonymous(myMockedRequestHandler))

设置起来有点麻烦,但它允许您显式地执行同步行为测试(这是BehaviorTestKit的主要目的),并且还为您单独提供了标准行为实现的简化测试点。IdiomaticMockito(来自mockitto -scala)也使它更易于处理。

相关内容

  • 没有找到相关文章

最新更新