Отказ от участия в гоночных условиях для актера Акка - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть несколько актеров Akka, с которыми я тестирую akka.testkit.javadsl.TestKit.

Существует главный актер (MainActor), который создает некоторых дочерних актеров (Child1, Child2).В них используется другой актер, который не является частью кода, который я тестирую, поэтому я использую тестового актера (TestKit.getRef()) в качестве этого актера.

Несколько актеров в конечном итоге отправят разные сообщения моему тестируемому актеру.Так как они выполняются одновременно, иногда сообщения приходят в разных порядках на разных запусках.

Мой тестовый код в настоящее время выполняет что-то вроде

  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 - это способ создания нескольких акторов, но есть только один момент, когда тестовый актерпоэтому использование нескольких участников теста потребовало бы значительного переписывания производственного кода для поддержки теста.

...