簡體   English   中英

產生akka持續性actor測試事件

[英]akka persistent actor testing events generated

根據CQRS的定義,可以/應該驗證命令,最后甚至可以拒絕(如果驗證未通過)。 作為命令驗證的一部分,我檢查是否確實需要狀態轉換。 因此,以一個簡單的虛擬示例為例:actor處於狀態A。命令被發送到actor以過渡到狀態B。該命令得到驗證,並在最后生成StateBUpdated事件。 然后,將完全相同的命令發送到狀態B。再次驗證該命令,並在驗證過程中確定將不生成任何事件(因為我們已經處於狀態B),並且僅響應該命令已被處理且一切都已完成。好。 這是種冪等的事。

不過,我很難(單元)對此進行測試。 持久性actor的常規單元測試就像向該actor發送命令,然后重新啟動actor並檢查狀態是否持久。 我想測試是否向演員發送命令以檢查生成了多少事件。 怎么做?

謝謝

我們在基於akka持久性開發內部CQRS框架時遇到了這個問題。 我們的解決方案是使用持久性查詢( https://doc.akka.io/docs/akka/2.5/scala/persistence-query.html )。 如果您沒有使用過,它是日記插件可以有選擇地實現的查詢接口,並且可以用作CQRS系統中的讀取方。

為了您的測試目的,該方法將是eventsByPersistenceId,它將為您提供akka流Source,其中包含由actor保留的所有事件。 可以將源折疊成事件列表,例如:

public CompletableFuture<List<Message<?>>> getEventsForIdAsync(String id, FiniteDuration readTimeout) {
  return ((EventsByPersistenceIdQuery)readJournal).eventsByPersistenceId(id, 0L, Long.MAX_VALUE)
      .takeWithin(readTimeout)
      .map(eventEnvelope -> (Message<?>)eventEnvelope.event())
      .<List<Message<?>>>runFold(
          new ArrayList<Message<?>>(),
          (list, event) -> {
            list.add(event);
            return list;
          }, materializer)
      .toCompletableFuture();
}

抱歉,如果上述方法顯得腫,我們將使用Java,因此如果您習慣使用Scala,那確實很丑。 獲取readJournal很簡單:

ReadJournal readJournal = PersistenceQuery.lookup().get(actorSystem)
    .getReadJournalFor(InMemoryReadJournal.class, InMemoryReadJournal.Identifier())

您可以看到我們使用了akka.persistence.inmemory插件,因為它是最適合測試的插件,但是任何實現Persistence Query API的插件都可以使用。

實際上,我們在框架內制作了一個類似於BDD的測試API,因此典型的測試如下所示:

fixture
  .given("ID1", event(new AccountCreated("ID1", "John Smith")))
  .when(command(new AddAmount("ID1", 2.0)))
  .then("ID1", eventApplied(new AmountAdded("ID1", 2.0)))
  .test();

如您所見,我們還處理在給定子句中設置先前事件的情況,以及可能處理多個persistenceIds(我們使用ClusterSharding)的情況。

從您的描述看來,您似乎需要模擬持久性,或者至少能夠輕松訪問其狀態。 我能夠找到兩個可以做到這一點的項目:

akka-persistence-mock設計用於測試,但未積極開發。

阿卡的持久性,inmemory

在測試持久性參與者,持久性FSM和akka集群時,這非常有用。

我建議使用后者,因為它提供了從日記中檢索所有郵件的可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM