用于 akka actors 中私有方法的 powermockito
powermockito for private methods in akka actors
我有以下演员
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;
}
现在要对这个 actor 进行单元测试,我应该模拟方法 'doSomethingNow' 吗?从 PowerMockito 文档来看,我似乎还需要模拟演员 class 但 TestKit 已经提供了一个围绕模拟演员的框架,测试这个演员的正确方法是什么?
您在这里可以做的最好的事情就是使用依赖注入。理想情况下 - 您的参与者不应包含任何业务逻辑 - 他们需要将消息路由到底层服务。
在你的情况下,你可以有一个单独的服务,例如 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 将绰绰有余。
恕我直言,只要 Mockito 不足以对您的代码进行单元测试,那么您的设计很可能存在问题。代码不仅应该写得好而且可重用 - 它还应该是可测试的。
我有以下演员
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;
}
现在要对这个 actor 进行单元测试,我应该模拟方法 'doSomethingNow' 吗?从 PowerMockito 文档来看,我似乎还需要模拟演员 class 但 TestKit 已经提供了一个围绕模拟演员的框架,测试这个演员的正确方法是什么?
您在这里可以做的最好的事情就是使用依赖注入。理想情况下 - 您的参与者不应包含任何业务逻辑 - 他们需要将消息路由到底层服务。
在你的情况下,你可以有一个单独的服务,例如 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 将绰绰有余。
恕我直言,只要 Mockito 不足以对您的代码进行单元测试,那么您的设计很可能存在问题。代码不仅应该写得好而且可重用 - 它还应该是可测试的。