测试amazon SWF工作流



我正试图为我的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: not ready'在handleException行。

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

代码是异步的,所以handleException应该在doTry()执行之前被调用。但是如果它被标记为@Asynchronous,那么它不应该被执行,直到异常承诺准备好。确保@Asynchronous设置正确。

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

最新更新