【问题标题】:powermockito for private methods in akka actorspowermockito 用于 akka actor 中的私有方法
【发布时间】:2018-03-24 05:39:46
【问题描述】:

我有以下演员

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

【问题讨论】:

    标签: java akka powermock testkit


    【解决方案1】:

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

    在您的情况下,您可以使用单独的服务,例如 DoerServicedoSomethingNow 方法。然后你可以通过你选择的依赖注入框架注入它,如下所示:

    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 不足以对您的代码进行单元测试,那么您的设计很可能有问题。代码不仅应该编写良好且可重用 - 它还应该是可测试的。

    【讨论】:

    • 理想情况下,它是类的另一个接口(遵循 SOLID 的依赖倒置原则)。但是,只要它是仅供内部使用的 bean(例如,当您不构建其他人使用的库或 API 时),我个人的观点是,将它作为一个没有接口的单独类就足够了。
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 2015-03-23
    • 1970-01-01
    • 2014-09-21
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多