java - akka actor 中私有(private)方法的 powermockito

标签 java akka powermock testkit

我有以下 Actor

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 文档来看,我似乎还需要模拟作为 actor 的类,但是 TestKit 已经提供了一个围绕模拟 actor 的框架,测试这个 actor 的正确方法是什么?

最佳答案

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

在您的情况下,您可以有一个单独的服务,例如其中包含 doSomethingNow 方法的 DoerService 。然后您可以通过您选择的依赖注入(inject)框架注入(inject)它,如下所示:

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

关于java - akka actor 中私有(private)方法的 powermockito,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49457510/

相关文章:

java - 如何在appfuse中仅显示子菜单项

scala - 将函数转换为部分函数 scala

Url 模拟测试中出现 java.lang.NullPointerException

java - 使用 Gson 解析列表对象 json

java - 如何区分父类(super class)的ArrayList中的子类

java - 无法在 Selenium Web 驱动程序 (Java) 中启动 Chrome

akka - 使用 Akka HTTP 上传多部分表单数据

scala - Akka未加载application.conf

java - PowerMockito : how to mock methods called by the constructor?

java - 使用静态枚举类模拟类时出现 "Failed to transform class with name"错误