Java 使用Spring Boot在Activiti中为JUnit测试生成ApplicationContext时发生异常

Java 使用Spring Boot在Activiti中为JUnit测试生成ApplicationContext时发生异常,java,exception,junit,spring-boot,activiti,Java,Exception,Junit,Spring Boot,Activiti,每当我尝试使用Spring Boot为Activiti运行下面的JUnit测试时,我都无法解决下面的异常 例外情况: 2015-05-07 20:15:00 org.springframework.test.context.TestContext.<init>(93@main) INFO @ContextConfiguration not found for class [class ProcessXTest]. 2015-05-07 20:15:00 org.springframe

每当我尝试使用Spring Boot为Activiti运行下面的JUnit测试时,我都无法解决下面的异常

例外情况:

2015-05-07 20:15:00 org.springframework.test.context.TestContext.<init>(93@main) INFO @ContextConfiguration not found for class [class ProcessXTest].
2015-05-07 20:15:00 org.springframework.test.context.TestContextManager.retrieveTestExecutionListeners(143@main) INFO @TestExecutionListeners is not present for class [class ProcessXTest]: using defaults.
2015-05-07 20:15:00 org.springframework.test.context.TestContextManager.prepareTestInstance(234@main) ERROR Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@232023ff] to prepare test instance [ProcessXTest@131b4c5d]
java.lang.IllegalArgumentException: Can not build an ApplicationContext with a NULL 'contextLoader'. Consider annotating your test class with @ContextConfiguration.
我正在使用以下依赖项:

compile 'org.activiti:activiti-engine:5.17.0'
compile 'org.activiti:spring-boot-starter-basic:5.17.0'
compile 'org.activiti:spring-boot-starter-rest-api:5.17.0'

compile 'junit:junit:4.12'

compile 'org.springframework.boot:spring-boot-starter-web:1.2.3.RELEASE'
compile 'org.springframework.boot:spring-boot-starter-test:1.2.3.RELEASE'

我最终通过定义JUnit测试解决了这个问题,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { Application.class })
public class ProcessXTest {

    private static final Logger LOGGER = LoggerFactory.getLogger(ProcessXTest.class);

    private static final String BPMN_LOCATION = "./src/main/resources/processes/processx.bpmn";
    private static final String BPMN_NAME = "processx.bpmn";
    private static final String PROCESS_KEY = "processx";

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Autowired
    private HistoryService historyService;

    @Before
    public void loadModel() throws FileNotFoundException {
        LOGGER.debug("Loading the model for unit testing.");

        Deployment deployment = repositoryService.createDeployment().addInputStream(BPMN_NAME, new FileInputStream(BPMN_LOCATION)).deploy();
        assertNotNull(deployment.getId());
        assertTrue(repositoryService.getDeploymentResourceNames(deployment.getId()).contains(bpmnName));
    }

    @Test
    public void testProcess() {
        LOGGER.debug("Unit testing the process.");

        List<Task> tasks = taskService.createTaskQuery().list();
        assertEquals(tasks.size(), 0);

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(PROCESS_KEY, new HashMap<String, Object>());
        assertNotNull(processInstance.getId());

        tasks = taskService.createTaskQuery().list();
        assertEquals(tasks.size(), 1);
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(类={Application.class})
公共类ProcessXTest{
私有静态最终记录器Logger=LoggerFactory.getLogger(ProcessXTest.class);
私有静态最终字符串BPMN_LOCATION=“./src/main/resources/processs/processx.BPMN”;
私有静态最终字符串BPMN_NAME=“processx.BPMN”;
私有静态最终字符串进程\u KEY=“processx”;
@自动连线
私人寄存服务寄存服务;
@自动连线
私有RuntimeService RuntimeService;
@自动连线
私人任务服务任务服务;
@自动连线
私人历史服务历史服务;
@以前
public void loadModel()引发FileNotFoundException{
debug(“为单元测试加载模型”);
部署部署=repositoryService.createDeployment().addInputStream(BPMN_名称,新文件InputStream(BPMN_位置)).deploy();
assertNotNull(deployment.getId());
assertTrue(repositoryService.getDeploymentResourceNames(deployment.getId()).contains(bpmnName));
}
@试验
公共void testProcess(){
debug(“对流程进行单元测试”);
List tasks=taskService.createTaskQuery().List();
assertEquals(tasks.size(),0);
ProcessInstance ProcessInstance=runtimeService.startProcessInstanceByKey(PROCESS_KEY,new HashMap());
assertNotNull(processInstance.getId());
tasks=taskService.createTaskQuery().list();
assertEquals(tasks.size(),1);
}
}
我不得不修改我的JUnit测试,因为@ActivitiRule通过使用类路径上的activiti.cfg.xml资源作为默认值来初始化ProcessEgine:

我的解决方案:

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.test.ActivitiRule;
import org.activiti.spring.boot.AbstractProcessEngineConfiguration;
import org.junit.Rule;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(AbstractSpringTest.ActivitiEngineTestConfiguration.class)
@ActiveProfiles("test")
public abstract class AbstractSpringTest {

    @Autowired @Rule
    public ActivitiRule activitiRule;

    @SpringBootApplication
    public static class ActivitiEngineTestConfiguration {

        @Bean
        public ActivitiRule activitiRule(ProcessEngine processEngine) {
            return new ActivitiRule(processEngine);
        }
    }
}
文件application-test.properties包含(在本例中使用h2):

AbstractSpringTest的每个子类都可以使用@Deployment:

public class ConcreteTest extends AbstractSpringTest {

    @Test
    @Deployment(resources = {"processes/test_process.bpmn20.xml"})
    public void testSomething() {
    }
}

是否尝试使用@ContextConfiguration注释测试类?添加此注释将返回以下异常:
2015-05-07 22:41:57 org.springframework.test.context.TestContextManager.prepareTestInstance(234@main)允许TestExecutionListener时捕获异常错误[org.springframework.test.context.support]。DependencyInjectionTestExecutionListener@367cca66]准备测试实例[ProcessXTest@3acc0a7c]异常为java.io.FileNotFoundException:类路径资源[ProcessXTest context.xml]无法打开,因为它不存在
,所以在它试图查找它的位置是否有contextconfiguration xml?请看一看,例如或。您似乎还可以尝试@Configuration注释。是的,我通过引入xml上下文配置文件(未定义bean)绕过了异常但是,在运行测试时,这在
repositoryService.createDeployment()
上提供了一个空指针。我不希望使用任何外部XML上下文配置文件,因为所有bean都已在主应用程序类中定义。
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.test.ActivitiRule;
import org.activiti.spring.boot.AbstractProcessEngineConfiguration;
import org.junit.Rule;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(AbstractSpringTest.ActivitiEngineTestConfiguration.class)
@ActiveProfiles("test")
public abstract class AbstractSpringTest {

    @Autowired @Rule
    public ActivitiRule activitiRule;

    @SpringBootApplication
    public static class ActivitiEngineTestConfiguration {

        @Bean
        public ActivitiRule activitiRule(ProcessEngine processEngine) {
            return new ActivitiRule(processEngine);
        }
    }
}
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:activiti?characterEncoding=UTF-8
spring.datasource.username=sa
spring.datasource.password=sa

spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.show-sql=true
public class ConcreteTest extends AbstractSpringTest {

    @Test
    @Deployment(resources = {"processes/test_process.bpmn20.xml"})
    public void testSomething() {
    }
}