当前位置: 首页 > 知识库问答 >
问题:

如何在Camunda Spring Boot应用程序的Junit测试中使用ProcessEngineRule?

衡翰藻
2023-03-14

我尝试为Camunda Spring Boot应用程序运行JUnit测试。我跟踪测试

JUnit 4

使用JUnit 4编写单元测试的风格,必须使用ProcessEngine规则。通过这条规则,流程引擎和服务可以通过getter获得。与ProcessEngine TestCase(见上文)一样,包含这条规则将在类路径上查找默认配置文件。当使用相同的配置资源时,流程引擎会在多个单元测试上静态缓存。

下面的代码片段显示了使用JUnit 4风格的测试和ProcessEngineRule的使用示例。

public class MyBusinessProcessTest {

  @Rule
  public ProcessEngineRule processEngineRule = new ProcessEngineRule();

  @Test
  @Deployment
  public void ruleUsageExample() {
    RuntimeService runtimeService = processEngineRule.getRuntimeService();
    runtimeService.startProcessInstanceByKey("ruleUsage");

    TaskService taskService = processEngineRule.getTaskService();
    Task task = taskService.createTaskQuery().singleResult();
    assertEquals("My Task", task.getName());

    taskService.complete(task.getId());
    assertEquals(0, runtimeService.createProcessInstanceQuery().count());
  }
}

但我有一个错误:

org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [activiti.cfg.xml]; nested exception is java.io.FileNotFoundException: class path resource [activiti.cfg.xml] cannot be opened because it does not exist
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
    at org.camunda.bpm.engine.impl.cfg.BeansConfigurationHelper.parseProcessEngineConfiguration(BeansConfigurationHelper.java:35)
    at org.camunda.bpm.engine.impl.cfg.BeansConfigurationHelper.parseProcessEngineConfigurationFromResource(BeansConfigurationHelper.java:50)
    at org.camunda.bpm.engine.ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(ProcessEngineConfiguration.java:305)
    at org.camunda.bpm.engine.ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(ProcessEngineConfiguration.java:301)
    at org.camunda.bpm.engine.impl.test.TestHelper.getProcessEngine(TestHelper.java:428)
    at org.camunda.bpm.engine.test.ProcessEngineRule.initializeProcessEngine(ProcessEngineRule.java:175)
    at org.camunda.bpm.engine.test.ProcessEngineRule.apply(ProcessEngineRule.java:154)
    at org.junit.rules.RunRules.applyAll(RunRules.java:26)
    at org.junit.rules.RunRules.<init>(RunRules.java:15)
    at org.junit.runners.BlockJUnit4ClassRunner.withTestRules(BlockJUnit4ClassRunner.java:400)
    at org.junit.runners.BlockJUnit4ClassRunner.withRules(BlockJUnit4ClassRunner.java:356)
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:278)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: java.io.FileNotFoundException: class path resource [activiti.cfg.xml] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330)
    ... 27 more

我可以添加activiti。cfg。xml,但我的Camunda Spring Boot应用程序不会使用它。只为测试而将文件添加到非测试源中,感觉是不对的。这也违反了DRY,因为我必须同步这两种配置。

在我的JUnit测试中是否有其他方法使用ProcessEngineRule?

共有3个答案

周翰
2023-03-14

错误消息具有误导性。卡蒙达正在寻找卡蒙达。cfg。xml,但返回到查找activiti。cfg。如果文件不存在,则返回xml。这可以通过两种方式解决。任何一个

a) 创建camunda。cfg。src/test/resources中的xml。

内容可以如下所示。根据需要调整插件列表。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="processEngineConfiguration"
          class="org.camunda.bpm.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
        <property name="history" value="full"/>
        <property name="expressionManager">
            <bean class="org.camunda.bpm.engine.test.mock.MockExpressionManager"/>
        </property>
        <property name="processEnginePlugins">
            <list>
                <bean class="org.camunda.connect.plugin.impl.ConnectProcessEnginePlugin"/>
                <bean class="org.camunda.spin.plugin.impl.SpinProcessEnginePlugin"/>
            </list>
        </property>
    </bean>
</beans>

(另一个例子:https://github.com/camunda/camunda-bpm-examples/blob/master/servicetask/rest-service/src/test/resources/camunda.cfg.xml)

b) 让您的测试扩展AbstractProcessEngineRunTest

@Deployment(resources = "process.bpmn")
public class PlainJavaProcessTest extends AbstractProcessEngineRuleTest {

完整示例:https://github.com/rob2universe/vanilla-camunda-template/blob/main/src/test/java/com/camunda/example/PlainJavaProcessTest.java

这个类为你做的是:

public final ProcessEngineRule processEngine = (new StandaloneInMemoryTestConfiguration(new ProcessEnginePlugin[0])).rule();

还有其他选择,例如扬·加林斯基在他的回答中概述的那些

史钊
2023-03-14

您的应用程序是否使用了EnableProcessApplication?如果是,我认为你实际上不需要组织。卡蒙达。bpm。发动机测验ProcessEngineRule更多信息:

  • 您可以通过Autowired RuntimeService RuntimeService获取RuntimeService <李>

但无论如何,如果你真的想使用规则:

编写自己的类:

public class MyProcessEngineRule extends ProcessEngineRule {

    @Override
    public Statement apply(Statement base, Description description) {
        // you can use this, if you use AbstractAssertions
        // super.processEngine = AbstractAssertions.processEngine(); 
        super.processEngine = processEngine();
        return super.apply(base, description);
    }

    public static ProcessEngine processEngine() {
        Map<String, ProcessEngine> processEngines = ProcessEngines.getProcessEngines();
        if (processEngines.size() == 1) {
            return processEngines.values().iterator().next();
        } else {
            throw new IllegalStateException("some usefule message");
        }
    }
}

并在您的测试类中使用@规则公共MyProcessEngine规则=new MyProcessEngine规则();

至少,那对我有用...

空俊语
2023-03-14

您可以使用这样的引擎实例化规则,然后Camunda不会尝试从cfg.xml文件中读取:

 @Rule
 public final ProcessEngineRule camunda = new ProcessEngineRule(myConfiguration.buildProcessEngine());

其中myConfiguration是您根据需要创建的ProcessEngine Configuration的实例。

如果您使用的是Spring Boot runner,请尝试导入camunda Spring Boot starter测试的依赖项,并使用StandaloneInMemoryTestConfiguration辅助程序进行此操作:

@Rule
public final ProcessEngineRule camunda = new StandaloneInMemoryTestConfiguration().rule();
 类似资料:
  • 我有一个用Spring:2.0.7的古老版本构建的老应用程序。我的任务是为这个应用程序添加新的功能,所以我也需要编写一些JUnit测试。 有没有其他方法可以在JUnit中加载ApplicationContext.XML文件,并访问该XML文件中定义的bean? 由于我已经有了mockup,而且它们不需要初始化参数,所以我可以实例化它们并将它们传递给setter,也许可以使用注释。但是如果可能的话,

  • 问题内容: 我有一堆JUnit测试用例(集成测试),它们在逻辑上分为不同的测试类。 我们能够为每个测试类加载一次Spring应用程序上下文,然后将其重新用于JUnit测试类中的所有测试用例 但是,我们只是想知道是否有一种方法可以对一堆JUnit测试类仅加载一次Spring应用程序上下文。 FWIW,我们使用Spring 3.0.5,JUnit 4.5并使用Maven构建项目。 问题答案: 是的,这

  • 问题内容: 您如何测试使用JUnit触发异步流程的方法? 我不知道如何让我的测试等待过程结束(这不完全是单元测试,它更像是集成测试,因为它涉及多个类,而不仅仅是一个类)。 问题答案: 恕我直言,让单元测试创​​建或在线程上等待是不好的做法。您希望这些测试能在几秒钟内运行。这就是为什么我想提出一种分两步的方法来测试异步过程。 测试您的异步过程是否已正确提交。您可以模拟接受异步请求的对象,并确保提交的

  • 问题内容: 我刚刚在我的express应用程序中添加了shouldjs和mocha进行测试,但是我想知道如何测试我的应用程序。我想这样做: 当然,测试套件中的最后一个测试只是告诉med,res.render函数(在show_create_user_screen中调用)是未定义的,可能是因为服务器未运行且配置尚未完成。所以我想知道其他人如何设置他们的测试? 问题答案: 好的,虽然测试路由代码是您可能

  • 问题内容: 我有一个使用React的网络应用程序,我正在尝试使用Selenium RC创建一些测试。我发现,当Selenium更改字段的值时,不会正确触发事件。我知道这是一个典型的问题,正如WebDriver常见问题所证明的那样,我已经尝试了很多不同的事情,例如使用onFocus而不是onChange并使用sendKeys()和type()确保焦点进出,以编程方式调用该事件以及我可以在网上找到的任

  • 我的JUnit测试用例失败了。行出现错误 mockito.When(BlogEntryService.Find(1L)).ThenReturn(entry); 故障跟踪是 java.lang.NullPointerException位于com.sample.controller.BlogentryControllerTest.GetExistingBlogEntry(BlogentryContro