我想爲我的SWF工作流程編寫測試,但遇到了一個問題,我猜測這是因爲我的工作流中存在異步代碼或Settable對象。測試亞馬遜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:沒有準備好」的handleException線。
請注意我正在使用@InjectMocks來實例化工作流對象,我猜我不需要在類路徑中的aspectweaver.jar這個?希望這是正確的。
大多數情況下,我的@Asynchronus代碼安裝正確,因爲工作流程相當陳舊,從來沒有問題。注意使用result.isReady(),謝謝。在原帖中增加了更多細節。 – Rana
java.lang.IllegalStateException:未準備好表示諾言尚未準備好。如果這個承諾是標記爲異步的方法的參數,那麼如果異步工作正常,則不可能。如果它顯示從doSomething到handleException的同步調用,則查看堆棧跟蹤,然後忽略異步。難道AspectJ配置不包括單元測試的包? –