我有一些与akka.testkit.javadsl.TestKit
一起测试的Akka演员。
有一个主要演员(MainActor
)创建了一些子演员(Child1
,Child2
)。它们使用了另一个actor,而该actor不是我正在测试的代码的一部分,因此我将测试actor(TestKit.getRef()
)用作该actor。
多个演员最终将向我的测试演员发送不同的消息。由于它们同时运行,因此有时消息在不同的运行中会以不同的顺序出现。
我的测试代码当前具有类似功能
GetFoo msg1 = expectMsgClass(GetFoo.class);
assertThat(msg1.getA(), is(4));
reply(new Foo("foo"));
SetBar msg2 = expectMsgClass(SetBar.class);
assertThat(msg2.getB(), is("delicious"));
如果SetBar
在GetFoo
之前到达,则失败。两种顺序都没有错:发送方正在做独立的事情。有没有编写测试的好方法,以便可以正常工作?
作为一个复杂的问题,这些小块在各种测试中都会重复,因此我将每个块分解为一个单独的方法。所以一个测试可能会做
expectGetFoo();
expectSetBar();
而另一个则
expectGetFoo();
expectGetBar();
expectNoMessage(Duration.ofMillis(100));
我认为我可以使用expectMessageAllOf
完成代码的初始块,然后检查每个返回的对象的类型,然后检查每个对象的适当断言,但是这很丑陋且复杂。一旦将这些位移动到单独的方法中,它似乎变得更加复杂。
我也知道TestProbe
是创建多个参与者的一种方法,但是只有一个地方提供了测试参与者,因此使用多个测试参与者将需要大量重写生产代码以支持测试