在 JUnit 测试中模拟 Apache Camel 的位置
问题描述:
我正在尝试模拟 Camel Routes 的 in
和 out
路径,但我不知道如何提供模拟输入和输出路径.请帮我解决这个问题.提前致谢.
I am trying to mock in
and out
paths of Camel Routes but I don't know how to provide mock in and out path.Please help me to fix this.Thanks in advance.
application.properties
inputFilePath = src/main/resources/in
outputFilePath = src/main/resources/out
application-test.properties
inputFilePath = src/test/java/in
outputFilePath = src/test/java/out
路由器和处理器:
@Component
public class FileLineByLineRouter extends RouteBuilder {
@Value("${inputFilePath}")
private String inputFilePath;
@Value("${outputFilePath}")
private String outputFilePath;
@Override
public void configure() throws Exception {
from("file://" + inputFilePath + "?delete=true").routeId("FileLineByLineRoute").marshal().string("UTF-8")
.split(body().tokenize("\n")).streaming().process(getFileParsingProcessor())
.to("file://" + outputFilePath + "?fileExist=Append").end();
}
@Bean
public Processor getFileParsingProcessor() {
return new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
String order = exchange.getIn().getBody(String.class);
order = order + ": " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss S").format(new Date()) + "\n";
exchange.getIn().setBody(order);
}
};
}
}
Junit 测试代码:
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class })
@SpringBootTest(classes = FileLineByLineRouter.class)
@ActiveProfiles("test")
@EnableAutoConfiguration
public class FileLineByLineRouterTest2 extends CamelTestSupport {
@Autowired
protected CamelContext camelContext;
@Test
public void test() throws Exception {
camelContext.start();
Thread.sleep(2000);
File outDir = new File("src/test/java/out");
System.out.println(outDir.getAbsolutePath());
assertTrue(outDir.isDirectory());
assertTrue(outDir.listFiles().length != 0);
}
}
日志:
114 SpringCamelContext : Route: FileLineByLineRoute started and consuming from: file://src/test/java/in?delete=true
116 SpringCamelContext : Total 1 routes, of which 1 are started.
122 SpringCamelContext : Apache Camel 2.19.1 (CamelContext: camel-1) started in 0.582 seconds
138 FileLineByLineRouterTest2 : Started FileLineByLineRouterTest2 in 10.064 seconds (JVM running for 12.063)
179 FileLineByLineRouterTest2 : ********************************************************************************
180 FileLineByLineRouterTest2 : Testing: test(FileLineByLineRouterTest2)
180 FileLineByLineRouterTest2 : ********************************************************************************
222 o.apache.camel.impl.DefaultCamelContext : Apache Camel 2.19.1 (CamelContext: camel-2) is starting
223 o.a.c.m.DefaultManagementStrategy : JMX is disabled
238 o.a.c.i.converter.DefaultTypeConverter : Loaded 193 type converters
239 o.apache.camel.impl.DefaultCamelContext : StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
239 o.apache.camel.impl.DefaultCamelContext : Total 0 routes, of which 0 are started.
239 o.apache.camel.impl.DefaultCamelContext : Apache Camel 2.19.1 (CamelContext: camel-2) started in 0.017 seconds
239 SpringCamelContext : Apache Camel 2.19.1 (CamelContext: camel-1) is starting
239 SpringCamelContext : Total 1 routes, of which 1 are started.
239 SpringCamelContext : Apache Camel 2.19.1 (CamelContext: camel-1) started in 0.000 seconds
C:\Users\workspace\CamelProject\src\test\java\out
241 FileLineByLineRouterTest2 : ********************************************************************************
241 FileLineByLineRouterTest2 : Testing done: test(FileLineByLineRouterTest2)
241 FileLineByLineRouterTest2 : Took: 0.002 seconds (2 millis)
241 FileLineByLineRouterTest2 : ********************************************************************************
242 o.apache.camel.impl.DefaultCamelContext : Apache Camel 2.19.1 (CamelContext: camel-2) is shutting down
314 o.apache.camel.impl.DefaultCamelContext : Apache Camel 2.19.1 (CamelContext: camel-2) uptime 0.092 seconds
318 o.apache.camel.impl.DefaultCamelContext : Apache Camel 2.19.1 (CamelContext: camel-2) is shutdown in 0.071 seconds
336 o.s.w.c.s.GenericWebApplicationContext : Closing org.springframework.web.context.support.GenericWebApplicationContext@394df057: startup date [Mon Jan 08 17:32:43 IST 2018]; root of context hierarchy
344 o.a.camel.spring.SpringCamelContext : Apache Camel 2.19.1 (CamelContext: camel-1) is shutting down
346 o.a.camel.impl.DefaultShutdownStrategy : Starting to graceful shutdown 1 routes (timeout 300 seconds)
356 INFO 19900 --- [ - ShutdownTask] o.a.camel.impl.DefaultShutdownStrategy : Route: FileLineByLineRoute shutdown complete, was consuming from: file://src/test/java/in?delete=true
356 o.a.camel.impl.DefaultShutdownStrategy : Graceful shutdown of 1 routes completed in 0 seconds
362 o.a.camel.spring.SpringCamelContext : Apache Camel 2.19.1 (CamelContext: camel-1) uptime 0.123 seconds
362 o.a.camel.spring.SpringCamelContext : Apache Camel 2.19.1 (CamelContext: camel-1) is shutdown in 0.018 seconds
答
好的,在重新阅读您的评论和更新的问题后,我想我现在明白您的意思了……您的测试还没有工作.
OK, after re-reading your comments and your updated question, I guess I understand now what you mean... your test just don't work yet.
试试这个:
- 在您的测试类中删除
extends CamelTestSupport
.这是基于注释的测试支持的替代方法. - 在您的测试中删除
camelContext.start()
.我可能让你对我的建议示例感到困惑.您只需要在使用@UseAdviceWith
注释类时自己启动上下文 - 最后,请稍等.为了这个例子,在你的测试中插入
Thread.sleep(10000)
给文件处理时间.
- Remove
extends CamelTestSupport
in your Testclass. This is an alternative way to the annotation based test support. - Remove
camelContext.start()
in your Test. I probably confused you with my advice example. You only need to start the context yourself when you annotate the class with@UseAdviceWith
- And finally, just wait a bit. For the sake of the example insert
Thread.sleep(10000)
in your test to give the files time to process.
您可以使用 Camel NotifyBuilder (http://camel.apache.org/notifybuilder.html)
Instead of a fixed sleep you could use the Camel NotifyBuilder (http://camel.apache.org/notifybuilder.html)