Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单元测试Amazon SWF子工作流_Java_Unit Testing_Amazon Swf - Fatal编程技术网

Java 单元测试Amazon SWF子工作流

Java 单元测试Amazon SWF子工作流,java,unit-testing,amazon-swf,Java,Unit Testing,Amazon Swf,我有一个父工作流(ParentWorkflow)调用子工作流(ChildWorkflow),我正在尝试测试调用 父代码如下所示: public class ParentWorkflow { private final ChildWorkflowClientFactory childWorkflowClientFactory = new ChildWorkflowClientFactoryImpl(); public void runWorkflow()

我有一个父工作流(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);
                ...
            }
        ...
    }
}
@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);

我似乎无法将任何内容传递到工作流实现类中,是否有其他方法可以模拟子工作流?

您可以直接测试工作流代码,模拟其依赖项,而无需使用workflowTest:

这种方法允许测试封装在其他对象中的部分工作流,而不是整个工作流

如果出于任何原因(例如,您使用的是JUnit以外的其他测试框架),您不想依赖WorkflowTest@Rule,则可以始终使用以下方法执行异步代码:


编辑:以下内容仅适用于SpringWorkflowTest;由于某些原因,WorkflowTest没有添加WorkflowImplementation

使用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);
    ...
}

当您使用工厂时,框架将调用此模拟,而不是实际实现。

感谢您的响应!这非常接近于工作,但我想在父工作流中测试的代码被TryCatch块包围,似乎没有执行。你知道怎么触发里面的代码吗?我想我可以把它放在一个单独的代码块中并测试它,但是如果我可以直接在它的原始上下文中测试它,那就太好了。找出异步代码“卡住”的最佳方法是使用AsyncScope.getAsynchronousThreadDumpAsString方法。它将显示“异步堆栈转储”,其中列出每个未完成任务的“异步堆栈跟踪”。如果不看代码,就很难给出更具体的答案。顺便说一句,如果您使用WorkflowTest并指定测试超时,那么“异步线程转储”将自动发出。请更新上面的代码以显示发生了什么,但经过稍微调整后,发现您上面建议的异步作用域解决了问题,谢谢你的帮助。你使用的是什么版本的SDK?对于
WorkflowTest
,没有这样的
addWorkflowImplementation
方法。我的错-我在看SpringWorkflowTest,它确实有
addWorkflowImplementation
:哦,明白了,很抱歉,我没有看到您在代码段中使用Spring。
@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();
}
@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);
    ...
}