Как мы тестируем актеров в Java?

#java #testing #concurrency #actor #akka

#java #тестирование #параллелизм #актер #akka

Вопрос:

Единственное, что я видел до сих пор, это то, что кто-то опубликовал пример тестирования TypedActor. Я так понимаю, нет способа протестировать нетипизированный объект, скажем, через Junit? Документы Akka становятся лучше с каждым днем, но я не вижу упоминания о тестировании. Это действительно очевидно, и я просто чего-то не понимаю?

Комментарии:

1. Поправьте меня, если я ошибаюсь, но вам не нужно было бы тестировать актера напрямую, если все, что он делает, это вызывает метод в другом классе, который реализует логику: MyActor расширяет UntypedActor{ OnCall(Object o){ new MyBusinessRule().do(); } } Итак, тестируя актера, вы бы тестировали AKKA, а не свою логику.

Ответ №1:

Для тестирования с помощью JUnit вам нужно будет использовать средства, предоставляемые JUnit, документы по тестированию актера (Java equiv — это нетипизированный актер) находятся здесь: http://akka.io/docs/akka/snapshot/scala/testing.html

Комментарии:

1. Работает ли это с Java? Я пытался, но, похоже, не могу понять, как использовать с Java.

2. Нет, это не работает с Java. Если вам нужно использовать JUnit, то вам нужно будет использовать JUnit API.

Ответ №2:

Это возможно, по крайней мере, с версиями 1.3 и 2.0 и библиотекой akka-testkit.

Вы делаете что-то подобное для настройки вашего актера:

 @Before
public void initActor() {
    actorSystem = ActorSystem.apply();
    actorRef = TestActorRef.apply(new AbstractFunction0() {

        @Override
        public Pi.Worker apply() {
            return new Pi.Worker();
        }

    }, actorSystem);
}
  

Затем вы можете использовать класс TestProbe для тестирования вашего актера (для версии 1.3 это немного отличается):

 @Test
public void calculatePiFor0() {
    TestProbe testProbe = TestProbe.apply(actorSystem);
    Pi.Work work = new Pi.Work(0, 0);        
    actorRef.tell(work, testProbe.ref());

    testProbe.expectMsgClass(Pi.Result.class);     
    TestActor.Message message = testProbe.lastMessage();
    Pi.Result resultMsg = (Pi.Result) message.msg();
    assertEquals(0.0, resultMsg.getValue(), 0.0000000001);
}
  

В блоге, который я написал о некоторых своих опытах, доступно больше:
http://fhopf.blogspot.com/2012/03/testing-akka-actors-from-java.html

Ответ №3:

Возможно, вас заинтересует сообщение в блоге, которое я написал: Тестирование актеров AKKA с помощью Mockito и FEST-Reflect Пример, который я использую, основан на JUnit, Mockito и FEST-Reflect. Дайте мне знать, если это будет вам полезно.