Я пытаюсь написать тесты для моего рабочего процесса 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 в пути к классам для этого? Надеюсь, это правильно.
Скорее всего, мой код @Asynchronus правильно настроен, поскольку рабочий процесс довольно старый и никогда не имел проблемы. Точка, отмеченная для использования result.isReady(), спасибо. Добавили более подробную информацию об исходном сообщении. – Rana
java.lang.IllegalStateException: не готово означает, что обещание не готово. если это обещание является аргументом метода, обозначенного Asynchronous, невозможно, если Asynchronous работает правильно. Посмотрите на трассировку стека, если он показывает синхронный вызов с doSomething для обработки Exception, тогда Asynchronous игнорируется. Может быть, что конфигурация AspectJ не включает пакет модульного теста? –