Как можно ожидать, что все сообщения обработаны актером в модульном тесте? - PullRequest
0 голосов
/ 06 июня 2019

Я использую актер Akka в нашем продукте. Мы написали некоторый код:

   @Singleton
   public class SingletonObj {
      private Map<String, Integer> cached = new HashMap();
      public void set(String key, Integer value) {
         cached.put(key, value);
      }

      public void delete(String key){
         cached.delete(key}
      }
   }

   public class MyActor  extends AbstractActor implements InjectedActorSupport {
       @Inject SingletonObj singletonObj;

        public static Props props(Injector injector) {
        return Props.create(MyActor.class, injector);
    }

    public MyActor(Injector injector) {
        this.injector = injector;
        receive(ReceiveBuilder.create()
            .match(AddEvent.class, this::addEvent)
            .match(DeteteEvent.class, this::deleteEvent))
            .build());
        }
        private void addEvent(AddEvent addEvent) {singletonObj.set(addEvent.key, addEvent.value);}

        private void deteleEvent(DeteteEvent event){singletonObj.detele(event.key);}
   }

   public class Controller {

       private Injector injector;
       private ActorSystem actorSystem;

       public void handleAdd()...

       public void handleDelete()...


   }

Тогда, когда я написал тест в junit для этих классов

   @Test public void testMethod(){
       sendAddRequest(...);
       sendDeteleRequest(...)
       ...
       ...

       assertThat(singletonObj.get("someString")).isEqual(42)
    }

Тогда этот тест ненадежен, потому что, когда я делаю утверждение, тогда все события еще не были обработаны.

Как я могу ждать, используя все события в финише актерской системы?

1 Ответ

0 голосов
/ 12 июня 2019

Импортируйте приведенный ниже пакет, и вы сможете ждать, пока не обработаете все события, или тест не пройдёт по истечении времени ожидания.

testCompile 'org.awaitility:awaitility:3.1.0'

import org.awaitility.Awaitility;

А перед вашим утверждением, что пользуетесь

await().pollInterval(5, TimeUnit.MILLISECONDS).until(() -> !isProcessed());

Метод isProcessed будет выглядеть примерно так:

protected Callable<Boolean> isProcessed() {
        return () -> {
            return singletonObj.getCacheCount()==2;
        };
    }

С уважением,

Vinoth

...