AxonFramework、注釈付きSagaをテスト

3064 ワード

コマンド処理コンポーネントと同様にsagaには、イベントにのみ応答する明確に定義されたインタフェースがあります.一方、sagaは通常、時間概念を有し、イベント処理プロセスの一部として他のコンポーネントと対話することができる.Axon Frameworkのテストサポートモジュールには、sagaテストの作成を支援するファームウェアが含まれています.各テストファームウェアには、前述したコマンド処理コンポーネントファームウェアと同様の3つのフェーズがあります.
  • givenあるイベント(ある集約から)、
  • whenイベント到着または時間経過、
  • expectのいくつかの動作または状態.

  • 「given」フェーズと「when」フェーズでは、イベントがインタラクションの一部として受け入れられます.「given」フェーズでは、生成されたコマンドなどのすべての副作用が無視される場合があります.「when」フェーズでは、一方、記録および検証されたsagaからイベントおよびコマンドが生成される.
    FixtureConfiguration fixture = new SagaTestFixture(InvoicingSaga.class);
    fixture.givenAggregate(invoiceId).published(new InvoiceCreatedEvent()) 
           .whenTimeElapses(Duration.ofDays(31)) 
           .expectDispatchedCommandsMatching(Matchers.listWithAllOf(aMarkAsOverdueCommand())); 
           // or, to match against the payload of a Command Message only 
           .expectDispatchedCommandsMatching(Matchers.payloadsMatching(Matchers.listWithAllOf(aMarkAsOverdueCommand())));
    

    sagaは、コマンド処理の結果をコールバック関数を使用して通知するコマンドを配布することができる.この動作は、テスト中に実際のコマンド処理が完了していないため、CallbackBehaviorオブジェクト定義を使用します.このオブジェクトはsetCallbackBehavior()を使用してファームウェアに登録され、コマンドが配布された後にコールバック関数を呼び出す必要があるかどうかを定義します.
    CommandBusを直接使用するのではなく、コマンドゲートウェイを使用することもできます.以下、彼らの行為をどのように規定するかを参照してください.
    通常、sagaはリソースとインタラクティブになります.これらのリソースはsaga状態の一部ではありませんが、sagaのロードと作成後に注入されます.テストファームウェアを使用すると、sagaに注入する必要があるリソースを登録できます.リソースを登録するには、リソースをパラメータとしてfixtureを呼び出すだけです.registerResource(Object)メソッド.ファームウェアはsaga上で適切なsetterメソッドまたはフィールド(@Inject注釈付き)を検出し、使用可能なリソースで呼び出す.
    MockitoやEasymockなどのシミュレーションオブジェクトをsagaに注入するヒントは、非常に有益かもしれません.これにより、sagaと外部リソースの正しいインタラクションを検証できます.
    コマンドゲートウェイはsagaにコマンドをスケジューリングするより簡単な方法を提供します.カスタムコマンドゲートウェイを使用すると、シミュレーションまたは杭を容易に作成して、テストでの動作を定義することもできます.しかしながら、シミュレーションまたは杭が提供されると、実際のコマンドは配布されない可能性があり、テストファームウェアで送信されたコマンドは検証できません.
    したがって、ファームウェアは、コマンドゲートウェイとオプションのシミュレーションを登録して動作を定義する2つの方法を提供します.registerCommandGateway(Class)とregisterCommandGateway(Class,Object)です.どちらのメソッドもgivenクラスのインスタンスを返し、使用するゲートウェイを表します.このインスタンスは、リソース注入の資格を持つようにリソースとして登録されています.
    registerCommandGateway(Class)がゲートウェイを登録するために使用されると、ファームウェア管理のCommandBusにコマンドが配布されます.ゲートウェイの動作は主にCallbackBehaviorによってファームウェアに定義される.明確なCallbackBehaviorが指定されていない場合、コールバックは呼び出されず、ゲートウェイに戻り値を指定できません.
    registerCommandGateway(Class,Object)がゲートウェイを登録する場合、2番目のパラメータはゲートウェイの動作を定義するために使用されます.
    テストファームウェアは、システム時間の遅延をできるだけ排除しようとしています.これは、テストの実行時に遅延する時間がないことを意味します.whenTimeElapses()の使用を明示的に宣言しない限り.すべてのイベントには、テストファームウェアが作成された瞬間のタイムスタンプがあります.
    テスト中に一時停止する時間は、イベントのパブリッシュをいつ計画するかをより容易に予測できます.テスト・インスタンスがイベントが30秒後にリリースされる予定であることを検証すると、実際のスケジュールとテスト実行の間の時間にかかわらず、30秒保持されます.
    注意ファームウェアは、スケジュールイベントや推進時間などの時間ベースのアクティビティとしてStubSchedulerを使用します.ファームウェアはsagaインスタンスに送信されたイベントのタイムスタンプをこのschedulerの時間に設定します.これは、ファームウェアが開始されると、時間が「stopped」になり、whenTimeAdvanceToおよびwhenTimeElapsesメソッドの使用が事前に決定される可能性があることを意味する.
    また、イベントのスケジュールをテストする必要がある場合は、テストファームウェアに関係のないStubEventSchedulerを使用することもできます.このEventScheduler実装では、どのイベントがどの時間にスケジュールされているかを検証し、操作時間の進展を選択できます.時間を特定の時間に繰り上げたり、時計を特定の日付と時間に移動したり、次の計画のイベントに繰り上げたりすることができます.これらの操作は、進捗間隔内に計画されたイベントを返します.