考虑以下黄瓜情形: -异步步骤执行与黄瓜-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帐户中有一个分支 - 看起来该项目对于更广泛的观众来说并不那么有趣,因此被删除以减少混乱。 –