2014-10-20 63 views
2

我有以下问题。我尝试使用activiti提供的模拟框架对单元测试进行单元测试。我有以下activiti.cfg.xmlActiviti未使用在Groovy脚本中使用Mocks.register()注册的对象

<?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.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"> 
     <property name="jobExecutorActivate" value="false" /> 
     <property name="expressionManager"> 
     <bean class="org.activiti.engine.test.mock.MockExpressionManager" /> 
     </property> 
    </bean> 
</beans> 

然后在测试我使用ActivitiRule运行过程:

@Rule 
public ActivitiRule activitiRule = new ActivitiRule(); 

@Before 
public void onInit() throws Exception { 
    Mocks.reset(); 
    //Deploy flows ... 
    Mocks.register("timeService", new TimeServiceImpl(null)); 
} 

private void execute() { 
    Map<String, Object> variables = new HashMap<String, Object>(); 
    variables.put("req", request); 
    activitiRule.getRuntimeService().startProcessInstanceByKey("ReturningFlow", variables); 
} 

的问题,我是用模拟注册的所有对象。 register()可用于ServiceTasks(在表达式中)内部使用,但在groovy脚本中不可用。我得到:

groovy.lang.MissingPropertyException: No such property: timeService for class: Script1 

所以的问题: 我做错了什么?这是Activiti的预期行为吗?我可以做些什么来测试使用Mock对象的流程中的脚本?

在此先感谢。

回答

1

因此,经过一段时间的实验,我有种破解解决方案。

我们需要脚本对象的MockResolver:

package com.deenero.activiti; 

import org.activiti.engine.delegate.VariableScope; 
import org.activiti.engine.impl.scripting.Resolver; 
import org.activiti.engine.impl.scripting.ResolverFactory; 
import org.activiti.engine.test.mock.Mocks; 

public class MockResolverFactory implements ResolverFactory{ 
    @Override 
    public Resolver createResolver(VariableScope variableScope) { 
     return new Resolver() { 

      @Override 
      public Object get(Object key) { 
       return Mocks.get(key); 
      } 

      @Override 
      public boolean containsKey(Object key) { 
       return Mocks.get(key) != null; 
      } 
     }; 
    } 
} 

然后Activiti的配置需要改变使用它:

<?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.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"> 
     <property name="jobExecutorActivate" value="false" /> 
     <property name="expressionManager"> 
      <bean class="org.activiti.engine.test.mock.MockExpressionManager" /> 
     </property> 
     <property name="resolverFactories"> 
      <list> 
       <bean class="org.activiti.engine.impl.scripting.VariableScopeResolverFactory" /> 
       <bean class="org.activiti.engine.impl.scripting.BeansResolverFactory" /> 
       <bean class="com.deenero.activiti.MockResolverFactory" /> 
      </list> 
     </property> 
    </bean> 

</beans> 

因此,这将允许使用通过模拟注册的所有豆。在Activiti脚本中注册(),因此我们可以对它们进行单元测试。