Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于jvm的异步步骤执行_Java_Asynchronous_Cucumber_Cucumber Jvm - Fatal编程技术网

Java 基于jvm的异步步骤执行

Java 基于jvm的异步步骤执行,java,asynchronous,cucumber,cucumber-jvm,Java,Asynchronous,Cucumber,Cucumber 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完成它。但是,如果出现故障,我无法断言故障。下面是代码片段

考虑以下情况:-

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();
}
“^POS令牌异步生成$”时的
@)
公共无效gs_Consumer()可丢弃{
HashMap m=DataContainer.getDataMap();
ExecutorService executor=Executors.newFixedThreadPool(2);
FutureTask futureTask1=null;
futureTask1=新的FutureTask(新的可调用(){
公共对象调用()引发异常{
DataContainer.setDataMap(m);
试一试{
检索消费者信息();
}捕获(可丢弃的e){
DataContainer.getDataMap().put(“异常”,e);
抛出新异常(e);
}
返回null;
}
});
执行人。执行(未来任务1);
DataContainer.getDataMap().put(“响应”,futureTask1);
//关闭Executor服务
executor.shutdown();
}
然后我在After方法中得到响应,因为我无法在此方法中执行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());
    }

}
public void afterAsynchMethod(){
试一试{
((FutureTask)DataContainer.getDataMap().get(“response”).get();
}捕获(中断异常|执行异常e){
//TODO自动生成的捕捉块
Assert.fail(如getMessage());
}
}

现在,如果异常发生在After方法中,那么场景仍然不会反映为失败的场景。在这种情况下,我如何使场景失败,或者通过其他方式失败?

此场景有很多细节。我会考虑把细节推倒在书堆里。在步骤将使用的帮助器类中尽可能多地隐藏

一种可能是

Scenario: Thomas pays for a yearly support subscription
Given Thomas has payed 150 EUR with his credit card
When the payment is confirmed
Then he should get a receipt
这更多地涉及预期行为,而不是实施。Thomas不关心服务是否异步

那么,如何实施呢?实现应该关注问题的异步性质。但情况并非如此。场景应仅描述所需的行为

对我来说,听起来您正在连接到外部服务。此程序无法控制的服务。可能是一个网络电话

我将创建一个存根,作为给定调用的实际服务进行响应。存根将立即响应,并且永远不会有断开的网络阻止它。这样就不需要在这里处理异步行为

然后,我将实现一个集成测试,该测试使用与调用存根相同的参数调用实际服务。当存根被硬编码以响应时,外部服务也会产生同样的原因。这不是一个面向业务的测试,因此我不会用小黄瓜来描述它。我可能会使用JUnit或类似的测试框架来实现它


这可能需要更多的工作,但它将提供更可靠的测试设置。您可以使用小黄瓜中描述的场景作为开发和业务涉众之间的沟通工具。利益相关者可能也不关心支付是否异步。他们关心的是Thomas可以付款并获得收据。

谢谢Thomas的回答!我在这里试图做的是在一个POC上工作,将调用rest和soap调用的SOAPUI测试转换成一个更灵活的框架。我选择cucumber的原因是,我们需要一种更好的方式来表示测试用例的流程,这些测试用例在Soapui中不是很清晰,甚至测试用例的可重用性似乎还有很多工作要做,更不用说新的ReadyApi软件是一个噩梦,会导致很多崩溃。嗨,Thomas,我同意你对cucumber文本的分析,但是,如果我不想删除外部服务,而是将其包括在验证中(即我们是否与正确且当前的API通信?是否有任何更改?),我们在使用cucumber创建系统集成测试时有非常相似的用例,因此,我们创建了一个小型库,使在测试中响应异步事件变得更加容易:@JörnHorstmann您的ghthub链接现在是404,你能检查一下这个项目是否已经转移到其他地方了吗?@Eddy最初的开发者在他的github帐户中仍然有一个分支-似乎这个项目对更广泛的受众来说没有那么有趣,因此被删除以减少混乱。