0

我有以下演员

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 已经提供了一个围绕模拟演员的框架,测试这个演员的正确方法是什么?

4

1 回答 1

2

您可以在这里做的最好的事情是使用依赖注入。理想情况下——你的参与者不应该在其中包含任何业务逻辑——他们需要将消息路由到底层服务。

在您的情况下,您可以有一个单独的服务,例如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 不足以对您的代码进行单元测试,那么您的设计很可能有问题。代码不仅应该写得很好并且可以重用——它还应该是可测试的。

于 2018-03-23T21:39:46.403 回答