Я новичок в akka, и я пытаюсь akka на java. Я хотел бы понять модульное тестирование бизнес-логики внутри участников. Я прочитал documentation и единственный пример изолированного бизнес-логики в актера:Единичное тестирование частных методов в Akka
static class MyActor extends UntypedActor {
public void onReceive(Object o) throws Exception {
if (o.equals("say42")) {
getSender().tell(42, getSelf());
} else if (o instanceof Exception) {
throw (Exception) o;
}
}
public boolean testMe() { return true; }
}
@Test
public void demonstrateTestActorRef() {
final Props props = Props.create(MyActor.class);
final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testA");
final MyActor actor = ref.underlyingActor();
assertTrue(actor.testMe());
}
Хотя это просто, это означает, что метод, который я хочу, чтобы проверить, является достоянием общественности. Однако, учитывая, что субъекты должны общаться только через сообщения, я понимаю, что нет оснований для публичных методов, поэтому я сделал свой метод приватным. Как и в примере ниже:
public class LogRowParser extends AbstractActor {
private final Logger logger = LoggerFactory.getLogger(LogRowParser.class);
public LogRowParser() {
receive(ReceiveBuilder.
match(LogRow.class, lr -> {
ParsedLog log = parse(lr.rowText);
final ActorRef logWriter = getContext().actorOf(Props.create(LogWriter.class));
logWriter.tell(log, self());
}).
matchAny(o -> logger.info("Unknown message")).build()
);
}
private ParsedLog parse(String rowText) {
// Log parsing logic
}
}
Так к методу испытаний parse
я либо:
- нужно это сделать пакет-частного
- Или открытый интерфейс тест актера, то есть, что следующий актер
LogWriter
получил правильный разобранные сообщение от моего актераLogRowParser
Мои вопросы:
- Есть ли недостатки в опции №1? Предполагая, что субъекты, общающиеся только через сообщения, инкапсуляция и чистые открытые интерфейсы, менее важны?
- В случае, если я попытаюсь использовать опцию № 2, есть ли способ поймать сообщения, отправленные от актера в тесте вниз по течению (тестирование
LogRowParser
и ловить вLogWriter
)? Я рассмотрел различные примеры наJavaTestKit
, но все они захватывают сообщения, которые являются ответами отправителю, и ни один из них не показывает, как перехватить сообщение, отправляемое новому актеру. - Есть ли другой вариант, который мне не хватает?
Спасибо!
UPD: Забыл упомянуть, что я также рассмотрел варианты, как:
- Перемещение логики из актеров полностью в вспомогательные классы. Это обычная практика с аккой?
- Powermock ... но я пытаюсь избежать, если редизайн возможно
Большое спасибо за ответ и эту часть в частности. _ ActorRef не раскрывает никакого внутреннего состояния или методов этого класса актера. Это своего рода одна из больших точек продажи актерской системы, она не только отвечает на мой вопрос, но и помогает мне лучше понять актерские модели. –
Вы правы (я проголосовал за ваш ответ), но вы на самом деле не отвечали ни на какие конкретные вопросы. Предполагая, что вы не можете изменить данную кодовую базу, как вы поступите? –
@JamesSharp, я добавил немного более подробно. Я не отвечаю на вопросы напрямую, но я предоставляю то, что, по моему мнению, является обоснованным подходом для тестирования участников. Надеюсь это поможет. – cmbaxter