Stack Exchange
Apache camel Junit keep Context running
We have some JUnits for testing camel routes and business logic, at some point there is a need to have camel context running, until response response received from server for one of the JUnit tests. We are using CamelSpringTestSupport. The problem is, no other JUnits running after that.
MyTest.java is below
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 looks like below, i may be doing a basic mistake by having two context?
<?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>


Manually creating your own context like this is error prone. Spring provides a JUnit runner to do this for you, which will reduce eliminate most of your setUp() code, reduce the risk of error, and tidy up nicely. Have a look at the Camel site under "Plain Spring Test Using JUnit 4.x With Java Config Example" to see how to use @RunWith(SpringJUnit4ClassRunner.class) in this situation.

if that code snippet is a JUnit test, I'm not so sure why you'd annotate it with @Component.
Anyway, assuming you are using Spring, then the JUnit code should be using the spring support annotation, as follow:
@RunWith(CamelSpringJUnit4ClassRunner.class)
@BootstrapWith(CamelTestContextBootstrapper.class)
@ContextConfiguration
public class MyCamelTest {
    @Autowired
    protected CamelContext camelContext;

full sample: http://camel.apache.org/spring-testing.html
If you are using Spring Boot then here's the sample to get started:
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = SpringBootApplication.class)
public class SpringBootCamelTest {

    @Autowired
    private CamelContext camelContext;

For a full sample:
https://github.com/apache/camel/blob/master/examples/camel-example-spring-boot/src/test/java/sample/camel/SampleCamelApplicationTest.java
