Powermockito для частных методов в актеров Акка
У меня есть следующий актер
import akka.actor.AbstractActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;
public class MyActor extends AbstractActor {
private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);
@Override
public Receive createReceive() {
return receiveBuilder()
.match(String.class, s -> {
log.info("Received String message: {}", s);
doSomethingNow();
})
.matchAny(o -> log.info("received unknown message"))
.build();
}
private MyObject doSomethingNow() {
/// code
return MyObject;
}
Теперь для модульного тестирования этого актера, я должен издеваться над методом 'doSomethingNow'? Из документа PowerMockito мне кажется, что мне также нужно издеваться над классом, который является актером, но TestKit уже предлагает платформу для насмешек над актерами. Какой правильный способ протестировать этого актера?
1 ответ
Лучшее, что вы можете здесь сделать, это использовать внедрение зависимостей. В идеале - ваши субъекты не должны содержать в себе никакой бизнес-логики - им нужно направить сообщение к базовым сервисам.
В вашем случае вы могли бы иметь отдельную услугу, например, DoerService
с doSomethingNow
метод в этом. Затем вы можете внедрить его с помощью структуры внедрения зависимостей, как показано ниже:
import akka.actor.AbstractActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;
public class MyActor extends AbstractActor {
private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);
@Inject
private DoerService doerService;
@Override
public Receive createReceive() {
return receiveBuilder()
.match(String.class, s -> {
log.info("Received String message: {}", s);
doerService.doSomethingNow();
})
.matchAny(o -> log.info("received unknown message"))
.build();
}
Таким образом, вам даже не понадобится Powermock для выполнения вашей задачи. Мокито будет более чем достаточно.
ИМХО, когда Mockito недостаточно для модульного тестирования вашего кода, скорее всего, что-то не так с вашим дизайном. Код должен быть не только хорошо написан и многократно использоваться - он также должен быть тестируемым.