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