【问题标题】:How to unit test quartz in camel如何在骆驼中对石英进行单元测试
【发布时间】:2016-01-21 21:15:56
【问题描述】:

我在弄清楚如何测试在其 from 中使用 quartz 的路线时遇到问题 我的spring 文件

<spring:route id="metricExtractionTimer" startupOrder="1">
    <spring:from uri="quartz://metricExtractionTimer?fireNow=true"/>
    <transform>
        <simple>........... Object Added to DB ...........</simple>
    </transform>
    <to uri="stream:out"/>
    <to uri="mock:result"/>
</spring:route>

我的测试文件

@RunWith(CamelSpringJUnit4ClassRunner.class)
@BootstrapWith(CamelTestContextBootstrapper.class)
@ContextConfiguration(locations = "/beans-test.xml")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class MetricExtractionTest{

    @EndpointInject(uri = "mock:result")
    protected MockEndpoint resultEndpoint;

    @Produce(uri = "quartz://metricExtractionTimer?fireNow=true")
    protected ProducerTemplate producerTemplate;

    @Test
    public void testQuartzCron() throws Exception {
        producerTemplate.sendBody(null);
    }
}

例外:

Caused by: org.apache.camel.FailedToStartRouteException: Failed to start route metricExtractionTimer because of startupOrder clash. Route quartz already has startupOrder 1 configured which this route have as well. Please correct startupOrder to be unique among all your routes.
    at org.apache.camel.impl.DefaultCamelContext.doCheckStartupOrderClash(DefaultCamelContext.java:3414)
    at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3364)
    at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3147)
    at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3003)
    at org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:172)
    at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2799)
    at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2795)
    at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:2818)
    at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:2795)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:2764)
    at org.apache.camel.test.spring.CamelSpringTestContextLoader$7.execute(CamelSpringTestContextLoader.java:515)
    at org.apache.camel.test.spring.CamelSpringTestHelper.doToSpringCamelContexts(CamelSpringTestHelper.java:92)
    at org.apache.camel.test.spring.CamelSpringTestContextLoader.handleCamelContextStartup(CamelSpringTestContextLoader.java:509)
    at org.apache.camel.test.spring.CamelSpringTestContextLoader.loadContext(CamelSpringTestContextLoader.java:164)
    at org.apache.camel.test.spring.CamelSpringTestContextLoader.loadContext(CamelSpringTestContextLoader.java:87)
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
    ... 28 more

【问题讨论】:

    标签: spring unit-testing junit apache-camel


    【解决方案1】:

    看起来 Camel 在手动触发自触发路线时遇到了麻烦,这是可以理解的。此外,您并不真的想测试 Camel Quartz 模块,因为这已经是经过良好测试的开源代码。

    我建议您使用 direct:yourRouteName consumer 将石英路由调用作为子路由。然后可以从您的单元测试中顺利调用它。

    【讨论】:

      【解决方案2】:

      另外,您并不真的想测试 Camel Quartz 模块,因为这已经是经过良好测试的开源代码。

      不同意这种说法。通过这种推理,我们也不应该测试我们与其他框架的交互,例如Spring、Hibernate、Camel 等

      @Bilal:最好的办法是看看 camel-quartz2 项目如何测试自身 [1]。

      具体可以看[2]和[3]。

      [1]https://github.com/apache/camel/tree/master/components/camel-quartz2/src/test

      [2]https://github.com/apache/camel/blob/master/components/camel-quartz2/src/test/java/org/apache/camel/component/quartz2/SpringQuartzCronRouteTest.java

      [3]https://github.com/apache/camel/blob/master/components/camel-quartz2/src/test/resources/org/apache/camel/component/quartz2/SpringQuartzCronRouteTest.xml

      举个例子:

      @Component
      public class MyRoute extends RouteBuilder {
      
        @Override
        public void configure() throws Exception {
          from("quartz2://myGroup/myTimerName?cron=0/2+*+*+*+*+?")
              .to("mock:result");
        }
      }
      
      
      @RunWith(CamelSpringBootRunner.class)
      @SpringBootTest
      public class MyRouteTest {
      
        @Autowired
        private CamelContext camelContext;
      
        @EndpointInject(uri = "mock:result")
        private MockEndpoint resultEndpoint;
      
        @Test
        public void testRoute() throws Exception {
          resultEndpoint.expectedMinimumMessageCount(3);
      
          MockEndpoint.assertIsSatisfied(camelContext);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-27
        • 2022-06-11
        • 1970-01-01
        • 2016-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多