考慮以下黃瓜情形: -異步步驟執行與黃瓜-JVM
Scenario: Test payment
Given I login to terminal
When POS token is generated asynchronously
Then user generates mobile token
And payment is successful
的步驟「POS令牌被異步生成」需要異步執行,不應該阻止後它的下游步驟的執行。我可以用Java中的FutureTask完成它。但是如果發生故障,我無法斷言失敗。下面是代碼片段
@When("^POS token is generated asynchronously$")
public void gs_Consumer() throws Throwable {
HashMap<String, Object> m = DataContainer.getDataMap();
ExecutorService executor = Executors.newFixedThreadPool(2);
FutureTask<Object> futureTask1 = null;
futureTask1 = new FutureTask<Object>(new Callable<Object>() {
public Object call() throws Exception {
DataContainer.setDataMap(m);
try {
retrieve_consumer_information();
} catch (Throwable e) {
DataContainer.getDataMap().put("exception", e);
throw new Exception(e);
}
return null;
}
});
executor.execute(futureTask1);
DataContainer.getDataMap().put("response", futureTask1);
// Shutdown the ExecutorService
executor.shutdown();
}
然後我得到的響應的方法,因爲我不能做futureTask1.get()此方法內,因爲它會阻擋來自執行其它下游步驟的執行後。
public void afterAsynchMethod() {
try {
((FutureTask<Object>) DataContainer.getDataMap().get("response")).get();
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
Assert.fail(e.getMessage());
}
}
現在,如果在After方法中發生異常,該方案仍不會反映爲失敗方案。在這種情況下我怎麼會失敗呢?
當使用黃瓜創建系統集成測試時,我們有非常相似的用例,因此我們創建了一個小型庫,使得測試中對異步事件的反應更容易:https://github.com/zalando/switchboard –
@JörnHorstmannyour ghthub鏈接現在是404,你可以檢查項目是否已經移到其他地方了嗎? – Eddy
@Eddy最初的開發者仍然在https://github.com/whiskeysierra/switchboard上的github帳戶中有一個分支 - 看起來該項目對於更廣泛的觀衆來說並不那麼有趣,因此被刪除以減少混亂。 –