Java ApacheCamel Junit保持上下文运行
我们有一些JUnit用于测试camel路由和业务逻辑,在某一点上需要运行camel上下文,直到从服务器收到一个JUnit测试的响应为止。我们正在使用CamelSpringTestSupport。问题是,之后没有其他JUnit运行 下面是MyTest.javaJava 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
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)
。