AxonFramework,測試帶註解的Saga

與命令處理組件類似,saga有一個明確定義的接口:它們只對事件作出響應。另一方面,saga通常具有時間概念,並且可以作爲事件處理過程的一部分與其他組件交互。Axon Framework的測試支持模塊包含幫助你編寫saga測試的固件。
每個測試固件包含三個階段,類似於前面部分描述的命令處理組件固件。
* 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提供了一個更簡單的方式來調度命令。使用自定義命令網關還可以更容易地創建模擬或樁來定義其在測試中的行爲。然而,當提供一個模擬或樁時,實際的命令可能不不會被分發,因此無法驗證測試固件中發送的命令。

因此,固件提供了兩個方法,讓你註冊命令網關和一個可選的模擬定義其行爲:registerCommandGateway(Class)和registerCommandGateway(Class, Object)。這兩種方法都返回一個given類的實例,表示要使用的網關。這個實例也註冊爲資源,使它具有資源注入的資格。

當registerCommandGateway(Class)用來註冊一個網關時,它分發命令到由固件管理的CommandBus。網關的行爲主要是通過CallbackBehavior定義於固件。如果沒有提供明確的CallbackBehavior,回調不調用,從而無法爲網關提供任何返回值。

當registerCommandGateway(Class, Object)是用來註冊一個網關,第二個參數是用於定義網關的行爲。

測試固件試圖儘可能消除系統時間遷延。這意味着它將會在測試執行時顯得沒有時間遷延。除非你顯式地聲明使用whenTimeElapses()。所有事件都將擁有測試固件創建那一刻的時間戳。

在測試期間暫停時間,可以更容易地預測在什麼時間計劃發佈事件。如果你的測試用例驗證一個事件在30秒後計劃發佈,它將保持30秒,而不管實際調度和測試執行之間的時間。

注意
固件使用StubScheduler作爲基於時間的活動,如調度事件和推進時間。固件將發送到saga實例的任何事件的時間戳設置爲這個scheduler的時間。這意味着一旦固件開始,時間就“stopped”,並可能提前確定使用whenTimeAdvanceTo和whenTimeElapses方法。

你還可以使用與測試固件無關的StubEventScheduler,如果你需要測試事件的調度。這個EventScheduler實現允許你驗證哪個事件被安排在哪個時間,並且給你選擇操縱時間的進展。你可以將時間提前到一個特定的時間,將時鐘移動到一個特定的日期和時間,或者將時間提前到下一個計劃的事件。所有這些操作將返回進度間隔內計劃的事件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章