首页 文章

单元测试Amazon SWF子工作流程

提问于
浏览
2

我有一个父工作流(ParentWorkflow)调用子工作流(ChildWorkflow),我正在尝试测试该调用 .

父代码看起来像这样:

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);

我似乎无法将任何内容传递到工作流实现类中,还有另一种方法可以模拟子工作流吗?

2 回答

  • 0

    您可以在不使用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();
    }
    
  • 4

    编辑:以下仅适用于SpringWorkflowTest;由于某种原因,WorkflowTest没有 addWorkflowImplementation .

    使用WorkflowTest的正确方法是为子工作流添加模拟实现,而不是添加实际类型:

    @Rule
    public SpringWorkflowTest workflowTest = new SpringWorkflowTest();
    @Mock
    private Activities mockActivities;
    @Mock
    private ChildWorkflow childWorkflowMock;
    
    private ParentWorkflowClientFactory workflowFactory
            = new ParentWorkflowClientFactoryImpl();
    
    @Before
    public void setUp() throws Exception {
        // set up mocks
        initMocks(this);
    
        workflowTest.addActivitiesImplementation(mockActivities);
        workflowTest.addWorkflowImplementationType(ParentWorkflowImpl.class);
        workflowTest.addWorkflowImplementation(childWorkflowMock);
        ...
    }
    

    然后,当您使用工厂时,框架将调用此mock而不是实际实现 .

相关问题