gpt4 book ai didi

java - 使用 @Asynchronous 方法对 SWF 进行单元测试

转载 作者:太空宇宙 更新时间:2023-11-04 12:49:38 25 4
gpt4 key购买 nike

我正在尝试测试具有异步方法的工作流程 - 设置大致如下所示:

@RunWith(FlowBlockJUnit4ClassRunner.class)
public class testWorkflow {
@Rule
public WorkflowTest workflowTest = new WorkflowTest();
@Mock
protected Activities mockActivities;

@Before
public void setUp() throws Exception {
workflowTest.addActivitiesImplementation(mockActivities);
workflowTest.addWorkflowImplementationType(Workflow.class);

workflow = workflowFactory.getClient();
}

@Test
public void testMethod1Exception() throws Throwable {
doThrow(new RuntimeException("bang!"))
.when(mockActivities).method1();

try {
runWorkflow();
fail();
} catch (Exception e) {
verify(mockActivities, never()).method2();
}
}

private void runWorkflow() throws Throwable {
AsyncScope scope = new AsyncScope() {
@Override
protected void doAsync() {
workflow.run();
}
};
scope.eventLoop();
if (!scope.isComplete()) {
System.out.println(scope.getAsynchronousThreadDumpAsString());
}
}
}

我的问题出在我的代码中,工作流程大致如下:

public class Workflow {
public void run() {
final Promise<Result> pResult = client.method1();
doAsync(pResult);
}

@Asynchronous
public void doAsync(Promise<Result> pResult) {
...
}
}

我发现单元测试命中了 fail() 调用。读取 getAsynchronousThreadDumpAsString 方法的输出似乎表明工作流正在等待 pResult 可用于 @Asynchronous 方法,但它不可用,因为我引发了异常。有什么办法可以让这样的测试发挥作用吗?我试图开始工作的实际测试是测试代码在 doCatch block 中的行为方式,但由于 @Asynchronous 方法调用,工作流程似乎卡住了。

最佳答案

我认为问题是您同时使用 AsyncScope 和 WorkflowTest 规则。 WorkflowTest 已经在 AsyncScope 中执行 @Test 方法,因此另一个 AsyncScope 可能会混淆它。我会重写你的代码,如下所示:

@RunWith(FlowBlockJUnit4ClassRunner.class)
public class testWorkflow {
@Rule
public WorkflowTest workflowTest = new WorkflowTest();
@Mock
protected Activities mockActivities;

@Before
public void setUp() throws Exception {
workflowTest.addActivitiesImplementation(mockActivities);
workflowTest.addWorkflowImplementationType(Workflow.class);

workflow = workflowFactory.getClient();
}

@Test
public void testMethod1Exception() throws Throwable {
doThrow(new RuntimeException("bang!"))
.when(mockActivities).method1();
new TryCatchFinally() {
Throwable failure;

protected void doTry() {
workflow.run();
}

protected void doCatch(Throwable e) {
failure = e;
}

protected void doFinally() {
assertNotNull(failure);
}
};
}
}

但实际上,使用预期时,甚至上述所有内容都不是必需的:

@RunWith(FlowBlockJUnit4ClassRunner.class)
public class testWorkflow {
@Rule
public WorkflowTest workflowTest = new WorkflowTest();
@Mock
protected Activities mockActivities;

@Before
public void setUp() throws Exception {
workflowTest.addActivitiesImplementation(mockActivities);
workflowTest.addWorkflowImplementationType(Workflow.class);

workflow = workflowFactory.getClient();
}

@Test(expected=RuntimeException.class)
public void testMethod1Exception() throws Throwable {
doThrow(new RuntimeException("bang!"))
.when(mockActivities).method1();
workflow.run();
}
}

@Test 方法内的代码在虚拟工作流程的上下文中执行。这就是为什么,例如,内部测试工作流程是使用普通客户端而不是外部客户端创建的。

关于java - 使用 @Asynchronous 方法对 SWF 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35953419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com