2016-11-08 83 views
0

我想为我的SWF工作流程编写测试,但遇到了一个问题,我猜测这是因为我的工作流中存在异步代码或Settable对象。测试亚马逊SWF工作流程

我的代码看起来像

@Asynchronous public Promise doSomething(final Object object,Promise success) { 

    final Settable<Throwable> exception = new Settable<Throwable>(); 
    final Settable<Boolean> result = new Settable<Boolean>(); 

    new TryCatch() { 

     @Override 
     protected void doTry() throws Throwable { 

       Promise<Boolean> waitFor = activitiesClient.doClientWork(object); 
       result.chain(waitFor); 
       setState(exception, null, waitFor); 
     } 

     @Override 
     protected void doCatch(Throwable t) throws Throwable { 

      result.set(false); 
      setState(exception, t, Promise.Void()); 
     } 
    }; 

    handleException(object, "Failed", exception); 
    return result; 
} 

当我运行我的测试,控制永远不会进入tryCatch和去直接handleException(..)线。我猜测我错过了关于Settable的一些事情?

正如其他论坛上的建议,我尝试了'WorkflowTest'和'AsyncScope'两种方法,但在为此工作流编写单元测试时仍无法克服类似问题。

请帮忙。

我测试的代码看起来像

@InjectMocks 
CustomWorkflow workflow = new CustomWorkflowImpl(); 

@Mock 
MyActivitiesClient activitiesClient; 

@Test 
public void testSomething() throws Throwable { 

    AsyncScope scope = new AsyncScope() { 

     protected void doAsync() { 

     workflow.doSomething(processTransaction); 
     } 
    }; 
    scope.eventLoop(); 

    // assert 
    verify(activitiesClient, times(1)).doClientWork(processTransaction); 
} 

不过,我得到一个异常消息“java.lang.IllegalStateException:没有准备好”的handleException线。

请注意我正在使用@InjectMocks来实例化工作流对象,我猜我不需要在类路径中的aspectweaver.jar这个?希望这是正确的。

回答

0

代码是异步的,因此预计在执行doTry()之前调用handleException。但是,如果标记为@Asynchronous,那么在异常承诺准备就绪之前不应执行它。确保@Asynchronous实际安装正确。我还将result.set(false)更改为if(!result.isReady()){result.set(false); }以确保它在已经设置的情况下不会抛出。

+0

大多数情况下,我的@Asynchronus代码安装正确,因为工作流程相当陈旧,从来没有问题。注意使用result.isReady(),谢谢。在原帖中增加了更多细节。 – Rana

+0

java.lang.IllegalStateException:未准备好表示诺言尚未准备好。如果这个承诺是标记为异步的方法的参数,那么如果异步工作正常,则不可能。如果它显示从doSomething到handleException的同步调用,则查看堆栈跟踪,然后忽略异步。难道AspectJ配置不包括单元测试的包? –