Java 单元测试Amazon SWF子工作流
我有一个父工作流(ParentWorkflow)调用子工作流(ChildWorkflow),我正在尝试测试调用 父代码如下所示: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()
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);
...
}