我正在尝试为我的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吗?希望这是正确的 .
1 回答
代码是异步的,因此在执行doTry()之前,应该调用handleException . 但如果用@Asynchronous标记,那么在异常保证准备就绪之前不应该执行它 . 确保实际上正确设置了@Asynchronous .
我也会将result.set(false)更改为if(!result.isReady()){result.set(false);如果已经设置,则确保它不会抛出 .