2017-09-04 126 views
0

在我的黃瓜測試中,我想截取我係統邊界上的一些調用,然後驗證這些調用的參數。Cucumber-guice:場景範圍攔截器?

因此,在每個場景中,我執行一些操作,攔截器攔截調用某些外部系統的參數並將它們存儲在某個類中,我們將其稱爲ScenarioContext。然後這些參數在我的@Then步驟定義中進行驗證。

的問題是ScenarioContext類具有全局@Singleton範圍意味着許多不好的事情,包括無法並行運行,必要情況下每個場景,場景之間無意依賴後手動清理。

黃瓜guice有一個偉大的功能,稱爲@ScenarioScoped註釋,它允許我有情景範圍的類,它的作品就像一個魅力。

我的問題:是否有可能以某種方式使我ScenarioContext類(使用我的攔截器來存儲截獲的東西)是「場景範圍的」,即,系統將自動每個場景等後清理?

回答

0

A @ScenarioScoped由黃瓜注入到您的步驟類的依賴性總是爲每個場景重新創建。你的工作是確保你在注入的依賴中沒有任何靜態字段。靜態字段屬於類而不是實例,因此它們不會爲每個新實例清除。

我寫了一個blogpost在哪裏我分享了Guice之間的狀態,這是我想你所問的。

+0

不完全是我的問題的答案。我已經在使用'@ ScenarioScoped'步驟定義,它工作。問題是我不得不使用總是具有單例作用域的攔截器,然後我無法弄清楚如何將單例作用域的攔截器與我想成爲場景範圍的對象連接起來。 – Alexander

0

是的,這是可能的,只需要適當地使用Guice噴射器。

  1. Guice允許通過提供者混合範圍。所以解決辦法是在我的黃瓜級Guice模塊中添加以下行:bind(ScenarioContext.class).toProvider(ScenarioContextProvider.class).in(CucumberScopes.SCENARIO); /*ScenarioContextProvider - my own basic implementation*/,然後將此提供者傳遞給攔截器。
  2. 其他的複雜情況是這樣的:在我的情況下,整個應用程序使用自己的Guice噴油器,攔截器必須在那裏創建。但ScenarioContext住在黃瓜Guice注射器。所以我必須明確地將Provider<ScenarioContext>對象傳遞給我的應用程序的Guice模塊。