Java ApacheCamel Junit保持上下文运行

Java ApacheCamel Junit保持上下文运行,java,junit,routes,apache-camel,jms,Java,Junit,Routes,Apache Camel,Jms,我们有一些JUnit用于测试camel路由和业务逻辑,在某一点上需要运行camel上下文,直到从服务器收到一个JUnit测试的响应为止。我们正在使用CamelSpringTestSupport。问题是,之后没有其他JUnit运行 下面是MyTest.java import java.io.File; import org.apache.activemq.camel.component.ActiveMQComponent; import org.apache.camel.Exchange; im

我们有一些JUnit用于测试camel路由和业务逻辑,在某一点上需要运行camel上下文,直到从服务器收到一个JUnit测试的响应为止。我们正在使用CamelSpringTestSupport。问题是,之后没有其他JUnit运行

下面是MyTest.java

import java.io.File;

import org.apache.activemq.camel.component.ActiveMQComponent;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.main.Main;
import org.apache.camel.test.spring.CamelSpringTestSupport;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.context.support.AbstractXmlApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class MyTest extends CamelSpringTestSupport{
    String prop1;   
    Main main;
    ActiveMQComponent jms;

    public void setUp() throws Exception {
        super.setUp();
        prop1 = context.resolvePropertyPlaceholders("{{prop1}}");        
        jms = (ActiveMQComponent) context.getComponent("jms");

        RouteBuilder builder = new RouteBuilder() {

            @Override
            public void configure() throws Exception {
                from("fromUri")
                .log("Got a message")               
                .to("file://C:\\Temp\\tempfolder");         
            }
        };        
        main = new Main();               
        main.addRouteBuilder(builder);
        main.bind("jms", jms);
        // add event listener
        //main.addMainListener(new Events());
        // set the properties from a file
        //main.setPropertyPlaceholderLocations("example.properties");
        // run until you terminate the JVM
        System.out.println("Starting Camel. Use ctrl + c to terminate the JVM.\n");
        main.run();
    }

    @Override
    protected AbstractXmlApplicationContext createApplicationContext() {
        return new ClassPathXmlApplicationContext("/yourcontext.xml");
    }

    @Test
    public void testMoveFile() throws Exception {
        // create a new file in the inbox folder with the name hello.txt and containing Hello World as body
        template.sendBodyAndHeader("file://C:\\targetIn", "Hello World", Exchange.FILE_NAME, "hello.txt");

        // wait a while to let the file be moved
        Thread.sleep(2000);

        // test the file was moved
        File target = new File("C:\\targetin\\hello.txt");
        assertTrue("File should have been moved", target.exists());

        // test that its content is correct as well
        String content = context.getTypeConverter().convertTo(String.class, target);
        assertEquals("Hello World", content);
    }

    @Test
    public void uploadData() throws Exception{  
        File target = new File("c:\\input.xml");
        assertTrue("File should have been moved", target.exists());

        template.sendBody(toUri, target);
    }
}
yourcontext.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"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xmlns:broker="http://activemq.apache.org/schema/core"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
         http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
         http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

    <context:component-scan base-package="com.yourpackage" />
    <bean id="properties" class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer">
          <property name="ignoreResourceNotFound" value="true"/>
          <property name="locations">
            <list>
                <value>classpath:yourproperties.properties</value>                              
            </list>
        </property>
    </bean>


    <camel:camelContext id="mytest" useMDCLogging="true" threadNamePattern="#camelId#:#name#-##counter#">
        <camel:contextScan />
        <camel:jmxAgent id="agent" createConnector="false" />
        <camel:template id="camelTemplate" />
    </camel:camelContext>

    <bean id="shutdown" class="org.apache.camel.impl.DefaultShutdownStrategy">
        <property name="timeout" value="120" />
    </bean>

    <bean id="jms" class="org.apache.activemq.camel.component.ActiveMQComponent">
        <property name="connectionFactory">
            <bean class="org.apache.activemq.spring.ActiveMQConnectionFactory">
                <property name="brokerURL" value="tcp://${activemq.host}:${activemq.port}" />
            </bean>
        </property>
    </bean>

</beans>

类路径:yourproperties.properties

如果该代码片段是JUnit测试,我不太清楚为什么要用@Component注释它

无论如何,假设您使用的是Spring,那么JUnit代码应该使用Spring支持注释,如下所示:

@RunWith(CamelSpringJUnit4ClassRunner.class)
@BootstrapWith(CamelTestContextBootstrapper.class)
@ContextConfiguration
public class MyCamelTest {
    @Autowired
    protected CamelContext camelContext;
全样本:

如果您使用的是Spring Boot,那么下面是开始使用的示例:

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = SpringBootApplication.class)
public class SpringBootCamelTest {

    @Autowired
    private CamelContext camelContext;
对于完整样本:

像这样手动创建自己的上下文容易出错。Spring提供了一个JUnit runner来为您执行此操作,这将减少并消除大部分
setUp()
代码,降低出错风险,并很好地进行整理。在“使用JUnit 4.x和Java配置示例的普通Spring测试”下查看,了解在这种情况下如何使用
@RunWith(SpringJUnit4ClassRunner.class)