Сamunda 替换测试中外部任务的行为

如何解决Сamunda 替换测试中外部任务的行为

我创建了简单的 Camunda spring boot 项目,并使用切换器创建了 simple BPMN process。 (5.5 KB)

我使用具有外部实现的服务任务作为 spring bean。我想为进程编写测试,但我不想测试 bean 的工作原理。因为通常我使用外部实现连接到数据库并将参数保存到上下文或对内部应用程序的 REST 调用。例如,我想跳过执行服务任务(一个),而是为切换器设置变量。我尝试使用camunda-bpm-assert-scenario进行测试过程并编写了简单的测试WorkflowTest。

我注意到如果我对 One.class 使用 @MockBean,那么 Camunda 会跳过委托执行。如果使用@Mock,则Camunda 执行委托执行。

PS 抱歉英语不好

一个

@服务 公共类一实现 JavaDelegate { 私人最终随机随机=新随机();

@Override
public void execute(DelegateExecution execution) throws Exception {
    System.out.println("Hello,One!");
    execution.setvariable("check",isValue());
}

public boolean isValue() {
    return random.nextBoolean();
}

}

工作流测试

@SpringBoottest @RunWith(springrunner.class) @Deployment(resources = "process.bpmn") 公共类 WorkflowTest 扩展了 AbstractProcessEngineRuleTest {

@Mock
private ProcessScenario insuranceApplication;

@MockBean
private One one;

@Before
public void init() {
    MockitoAnnotations.initMocks(this);
    Mocks.register("one",one);
}

@Test
public void shouldExecuteHappyPath() throws Exception {
    // given
    when(insuranceApplication.waitsAtServiceTask("Task_generator")).thenReturn(externalTaskDelegate -> {
                externalTaskDelegate.complete(withVariables("check",true));
            }
    );

    String processDeFinitionKey = "camunda-test-process";
    Scenario scenario = Scenario.run(insuranceApplication)
            .startByKey(processDeFinitionKey) // either just start process by key ...
            .execute();

    verify(insuranceApplication).hasFinished("end_true");
    verify(insuranceApplication,never()).hasstarted("three");
    verify(insuranceApplication,atLeastOnce()).hasstarted("two");

    assertthat(scenario.instance(insuranceApplication)).variables().containsEntry("check",true);
}

}

解决方法

我找到了两个解决方案:

  1. 这是一个小技巧。如果用户@MockBean 用于测试中的委托。委托将被跳过,但您在使用流程引擎变量时遇到问题。

  2. 用一个限定符创建两个 bean,并使用配置文件进行测试和生产。我曾经默认本地启动配置文件和测试配置文件进行测试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?