测试亚马逊SWF工作流程

时间:2016-11-08 15:05:29

标签: unit-testing amazon-swf

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

我的代码看起来像

@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的事情吗?

正如其他论坛所建议的那样,我尝试了两种方法&#39; WorkflowTest&#39;以及&#39; AsyncScope&#39;但是在为这个工作流程编写单元测试时仍然无法克服类似的问题。

请帮忙。

我的测试代码看起来像

@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);
}

但是我收到一条异常消息&#39; java.lang.IllegalStateException:not ready&#39;在handleException行上。

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

1 个答案:

答案 0 :(得分:0)

代码是异步的,因此在执行doTry()之前,应该调用handleException。但如果用@Asynchronous标记,那么在异常保证准备就绪之前不应该执行它。确保实际上正确设置了@Asynchronous。

我也会将result.set(false)更改为if(!result.isReady()){result.set(false);如果已经设置,则确保它不会抛出。