我尝试为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?
错误消息具有误导性。卡蒙达正在寻找卡蒙达。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();
还有其他选择,例如扬·加林斯基在他的回答中概述的那些
您的应用程序是否使用了EnableProcessApplication?如果是,我认为你实际上不需要组织。卡蒙达。bpm。发动机测验ProcessEngineRule更多信息:
但无论如何,如果你真的想使用规则:
编写自己的类:
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规则();
。
至少,那对我有用...
您可以使用这样的引擎实例化规则,然后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