避免将比赛条件发送给Akka测试演员

时间:2019-02-21 16:47:14

标签: java akka

我有一些与akka.testkit.javadsl.TestKit一起测试的Akka演员。

有一个主要演员(MainActor)创建了一些子演员(Child1Child2)。它们使用了另一个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"));  

如果SetBarGetFoo之前到达,则失败。两种顺序都没有错:发送方正在做独立的事情。有没有编写测试的好方法,以便可以正常工作?

作为一个复杂的问题,这些小块在各种测试中都会重复,因此我将每个块分解为一个单独的方法。所以一个测试可能会做

  expectGetFoo();
  expectSetBar();

而另一个则

  expectGetFoo();
  expectGetBar();
  expectNoMessage(Duration.ofMillis(100));

我认为我可以使用expectMessageAllOf完成代码的初始块,然后检查每个返回的对象的类型,然后检查每个对象的适当断言,但是这很丑陋且复杂。一旦将这些位移动到单独的方法中,它似乎变得更加复杂。

我也知道TestProbe是创建多个参与者的一种方法,但是只有一个地方提供了测试参与者,因此使用多个测试参与者将需要大量重写生产代码以支持测试

0 个答案:

没有答案