Akka и Java 8 TestKit на примере

Java 8 и Akka 2.12: 2.5.16 здесь. Я пытаюсь написать свой первый (когда-либо) модульный тест Akka с использованием Akka TestKit и изо всех сил пытаюсь применить принципы, которые я вижу в (очень немногих) примерах, которые мне удалось найти в Интернете.

Мои актеры:

public class Child extends AbstractActor {
    @Override
    public Receive createReceive() {
        return receiveBuilder()
            .match(Init.class, init -> {
                int workUnit = workService.doSomeWork();
                log.info("Performed work on {}", workUnit);
            }).build();
    }
}

public class Master extends AbstractActor {
    @Inject @Named("CHILD")
    private ActorRef child;

    @Override
    public Receive createReceive() {
        return receiveBuilder()
            .match(Init.class, init -> {
                child.tell(init, self());
            }).build();
    }
}

Очень и очень просто. Итак, теперь я просто хочу написать модульные тесты, которые проверяют, что когда субъект Master получает сообщение Init, он пересылает это сообщение своему субъекту Child. Моя лучшая попытка до сих пор:

@RunWith(MockitoJUnitRunner.class)
public class MasterTest {
    private ActorSystem actorSystem;

    @Before
    public void setup() {
        actorSystem = ActorSystem.create("test-system");
    }

    @After
    public void teardown() {
        Duration duration = Duration.create(10L, TimeUnit.SECONDS);
        TestKit.shutdownActorSystem(actorSystem, duration, true);
        actorSystem = null;
    }

    @Test
    public void onInit_shouldSendFordwardToChild() {
        // Given
        TestKit testKit = new TestKit(actorSystem);
        ActorRef master = actorSystem.actorOf(Props.create(Master.class, testKit));

        // When
        master.tell(new Init(), ActorRef.noSender());

        // Then
        testKit.expectMsg(Init.class);
    }
}

Когда я запускаю это, я получаю:

java.lang.IllegalArgumentException: no matching constructor found on class com.me.myapp.Master for arguments [class akka.testkit.TestKit]

Может ли кто-нибудь помочь мне подключить экземпляр TestKit к моему актору Master, а также помочь мне понять, как провести рефакторинг MasterTest, чтобы он проверял, чего я пытаюсь достичь? Заранее спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
878
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я понял это, не могу поверить, насколько сложно было заставить это работать: - /

В application.conf:

MyAkkApp {
  akka {
    remote {
      enabled-transports = ["akka.remote.netty.tcp"]
      netty.tcp {
        hostname = "127.0.0.1"
        port = 2553
      }
    }
  }
}

Потом:

@RunWith(MockitoJUnitRunner.class)
public class MasterTest extends TestKit {
    static ActorSystem actorSystem = ActorSystem.create("MyAkkaApp",
        ConfigFactory.load().getConfig("MyAkkaApp"));

    static TestProbe child;  // The mock child
    static ActorRef master;

    @BeforeClass
    public static void setup() {
        child = new TestProbe(actorSystem, "Child");
        master = actorSystem.actorOf(Props.create(new Creator<Actor>() {
            @Override
            public Actor create() throws Exception {
                return new Master(child.ref());
            }
        }));
    }

    public MasterTest() {
        super(actorSystem);
    }

    @Test
    public void onInit_shouldSendFordwardToChild() {
        // Given
        Init init = new Init();

        // When
        master.tell(init, super.testActor());

        // Then
        child.expectMsg(init);  // Child should have received it
        expectNoMessage();  // Master should not be returning to sender
    }
}

Давай, народ Акка! Поддержка приводит к принятию, внедрение ведет к стандартизации, стандартизация означает, что вы можете продавать корпоративные лицензии на поддержку с шестизначными цифрами.

Я не уверен, почему вам пришлось вносить какие-либо изменения в конфигурацию транспорта; Я не вижу, чтобы удаленное взаимодействие происходило. Помимо этого, в чем проблема? Akka не выполняет инъекцию зависимостей; когда у меня были родительско-дочерние акторы, я буквально создал дочерний элемент из родительского (getContext (). ActorOf (...)), и для тестирования я изолирую это в его собственном методе, подклассифицирую тестируемого актора и верните тестовый зонд.

Rob Crawford 07.11.2018 18:55

Спасибо @RobCrawford, я бы любовь увидел образец одного из ваших модульных тестов Akka TestKit ...

hotmeatballsoup 29.01.2019 20:27

Другие вопросы по теме