2016-11-08 81 views
0

我想爲我的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這個?希望這是正確的。

回答

0

代碼是異步的,因此預計在執行doTry()之前調用handleException。但是,如果標記爲@Asynchronous,那麼在異常承諾準備就緒之前不應執行它。確保@Asynchronous實際安裝正確。我還將result.set(false)更改爲if(!result.isReady()){result.set(false); }以確保它在已經設置的情況下不會拋出。

+0

大多數情況下,我的@Asynchronus代碼安裝正確,因爲工作流程相當陳舊,從來沒有問題。注意使用result.isReady(),謝謝。在原帖中增加了更多細節。 – Rana

+0

java.lang.IllegalStateException:未準備好表示諾言尚未準備好。如果這個承諾是標記爲異步的方法的參數,那麼如果異步工作正常,則不可能。如果它顯示從doSomething到handleException的同步調用,則查看堆棧跟蹤,然後忽略異步。難道AspectJ配置不包括單元測試的包? –