【问题标题】:Testing amazon SWF workflow测试亚马逊 SWF 工作流程
【发布时间】:2017-03-22 06:38:13
【问题描述】:

我正在尝试为我的 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 的一些东西?

按照其他论坛上的建议,我尝试了“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);
}

但是,我在 handleException 行上收到异常消息“java.lang.IllegalStateException: not ready”。

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

【问题讨论】:

    标签: unit-testing amazon-swf


    【解决方案1】:

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

    我还将 result.set(false) 更改为 if (!result.isReady()) { result.set(false); } 以确保它在已经设置的情况下不会抛出。

    【讨论】:

    • 很可能我的@Asynchronus 代码设置正确,因为工作流程很旧并且从未出现过问题。指出使用 result.isReady() 的要点,谢谢。在原帖上添加了更多细节。
    • java.lang.IllegalStateException: not ready 表示 promise 没有准备好。如果此承诺是标记为 Asynchronous 的方法的参数,则如果 Asynchronous 正常工作,则不可能。查看堆栈跟踪,如果它显示从 doSomething 到 handleException 的同步调用,则忽略异步。难道是AspectJ的配置没有包含单元测试的包?
    猜你喜欢
    • 2012-10-20
    • 2011-05-02
    • 1970-01-01
    • 2014-10-15
    • 2015-06-03
    • 1970-01-01
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多