【发布时间】: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?希望那是正确的。
【问题讨论】: