2015-05-27 2 views
2

У меня есть родительский рабочий процесс (ParentWorkflow), вызывающий дочерний рабочий процесс (ChildWorkflow), и я пытаюсь проверить вызов.Удостоверение блочных рабочих процессов Amazon SWF

Родительский код выглядит примерно так:

public class ParentWorkflow { 
    private final ChildWorkflowClientFactory childWorkflowClientFactory = 
      new ChildWorkflowClientFactoryImpl(); 

    public void runWorkflow() { 
     new TryCatch() { 
      @Override 
      protected void doTry() throws Throwable { 
       Promise<Void> workflowFinished = childWorkflowClient.childWorkflow(x); 
       ... 
      } 
     ... 
    } 
} 

Я хочу, чтобы дразнить вне childWorkflowClient.childWorkflow(x) вызова, однако, когда я подключение модульного теста я, кажется, не имеет возможность впрыснуть клиент завод, код модульного тестирования выглядит следующим образом:

@Rule 
public WorkflowTest workflowTest = new WorkflowTest(); 
@Mock 
private Activities mockActivities; 

private ParentWorkflowClientFactory workflowFactory 
     = new ParentWorkflowClientFactoryImpl(); 

@Before 
public void setUp() throws Exception { 
    // set up mocks 
    initMocks(this); 

    workflowTest.addActivitiesImplementation(mockActivities); 
    workflowTest.addWorkflowImplementationType(ParentWorkflowImpl.class); 
    workflowTest.addWorkflowImplementationType(ChildWorkflowImpl.class); 

Я, кажется, не быть в состоянии передать что-нибудь в классы реализации рабочего процесса, есть другой способ, я могу дразнить ребенка рабочий процесс вне дома?

ответ

4

Вы можете проверить код рабочего процесса непосредственно насмешливый его зависимости без использования workflowTest:

/** 
* Rule is still needed to initialize asynchronous framework. 
*/ 
@Rule 
public WorkflowTest workflowTest = new WorkflowTest(); 
@Mock 
private ActivitiesClient mockActivities; 
@Mock 
private BWorkflowClientFactory workflowFactory; 


@Before 
public void setUp() throws Exception { 
    // set up mocks 
    initMocks(this); 
} 

@Test 
public void myTest() { 
    AWorkflowImpl w = new AWorkflowImpl(workflowFactory); 
    w.execute(); // whatever execute method of the workflow 
} 

Такой подход позволяет тестировать части процесса инкапсулированных в других объектах, а не весь рабочий процесс.

Если по какой-либо причине (например, вы используете другую среду тестирования, чем JUnit) вы не хотите, чтобы полагаться на WorkflowTest @Rule асинхронного кода может быть всегда выполняется с помощью AsyncScope:

@Test 
public void asyncTest() { 
    AsyncScope scope = new AsyncScope() { 
     protected void doAsync() { 
     // Any asynchronous code 
     AWorkflowImpl w = new AWorkflowImpl(workflowFactory); 
     w.execute(); // whatever execute method of the workflow 
     } 
    }; 
    scope.eventLoop(); 
} 
+0

Спасибо за ответ ! Это очень близко к работе, но код, который я хочу протестировать в родительском рабочем потоке, окружен блоком TryCatch, и он, похоже, не выполняется. Есть идеи, как запускать код там? Полагаю, я мог бы просто вывести его в отдельный блок кода и протестировать его, но было бы неплохо, если бы я смог проверить его в исходном контексте напрямую. – Allan5

+0

Лучший способ узнать, где асинхронный код «застрял», - использовать метод AsyncScope.getAsynchronousThreadDumpAsString. Он покажет «асинхронный дамп стека», который отображает «асинхронную трассировку стека» для каждой выдающейся задачи. Не смотря на код, трудно дать более конкретный ответ. –

+0

BTW uf вы используете WorkflowTest и задаете тайм-аут для теста, тогда «асинхронный дамп потока» испускается автоматически. –

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