2016-11-08 2 views
0

Я пытаюсь написать тесты для моего рабочего процесса SWF, но застрял в проблеме, которая, как я полагаю, связана с асинхронным кодом или объектами Settable в моем рабочем процессе.Тестирование Amazon SWF workflow

Мой код выглядит

@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

Код является асинхронным, поэтому ожидается, что обработчик Exception будет вызван до выполнения doTry(). Но если он помечен как @Asynchronous, то он не должен исполняться до тех пор, пока не будет предоставлено обещание по выражению. Убедитесь, что @Asynchronous на самом деле настроена правильно.

Я бы также изменил result.set (false) на if (! Result.isReady()) {result.set (false); }, чтобы убедиться, что он не выбрасывается, если он уже установлен.

+0

Скорее всего, мой код @Asynchronus правильно настроен, поскольку рабочий процесс довольно старый и никогда не имел проблемы. Точка, отмеченная для использования result.isReady(), спасибо. Добавили более подробную информацию об исходном сообщении. – Rana

+0

java.lang.IllegalStateException: не готово означает, что обещание не готово. если это обещание является аргументом метода, обозначенного Asynchronous, невозможно, если Asynchronous работает правильно. Посмотрите на трассировку стека, если он показывает синхронный вызов с doSomething для обработки Exception, тогда Asynchronous игнорируется. Может быть, что конфигурация AspectJ не включает пакет модульного теста? –

Смежные вопросы