当前位置: 首页 > 知识库问答 >
问题:

使用多上下文的spring camel测试

怀飞扬
2023-03-14

那么,有人有一个如何在spring Camel中使用多上下文测试的示例吗?

Spring试验

public class BaseSpringTest extends CamelSpringTestSupport
{
    protected AbstractXmlApplicationContext createApplicationContext()
    {
        return new ClassPathXmlApplicationContext("camel-config.xml");
    }
} 

我的文件camel-config.xml

<beans>
 <context:annotation-config/>
 <import resource="classpath:camel-test-dao.xml" />
 <import resource="classpath:camel-contextA.xml"/>
 <import resource="classpath:camel-contextB.xml"/>
</beans>
<camelContext xmlns="camel.apache.org/schema/spring" id="contextA"> 
 ...
</camelContext>
<camelContext xmlns="camel.apache.org/schema/spring" id="contextB"> 
...
</camelContext>
@EndpointInject(uri = "direct:myroute", context="contextB")
private Endpoint eFooTest;
org.apache.camel.spring.GenericBeansException: Error post processing bean: com.mycompany.test.FooTest; nested exception is java.lang.NullPointerException
  at org.apache.camel.spring.CamelBeanPostProcessor.postProcessBeforeInitialization(CamelBeanPostProcessor.java:154)
  at org.apache.camel.test.spring.CamelSpringTestSupport.postProcessTest(CamelSpringTestSupport.java:62)
  at org.apache.camel.test.junit4.CamelTestSupport.doSetUp(CamelTestSupport.java:319)
  at org.apache.camel.test.junit4.CamelTestSupport.setUp(CamelTestSupport.java:238)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
  at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
  at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
  at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
  at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
  at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.NullPointerException
  at org.apache.camel.impl.CamelPostProcessorHelper.matchContext(CamelPostProcessorHelper.java:84)
  at org.apache.camel.impl.DefaultCamelBeanPostProcessor$1.doWith(DefaultCamelBeanPostProcessor.java:181)
  at org.apache.camel.util.ReflectionHelper.doWithFields(ReflectionHelper.java:73)
  at org.apache.camel.impl.DefaultCamelBeanPostProcessor.injectFields(DefaultCamelBeanPostProcessor.java:168)
  at org.apache.camel.impl.DefaultCamelBeanPostProcessor.postProcessBeforeInitialization(DefaultCamelBeanPostProcessor.java:82)
  at org.apache.camel.spring.CamelBeanPostProcessor.postProcessBeforeInitialization(CamelBeanPostProcessor.java:148)
  ... 31 more
@XmlTransient
private final DefaultCamelBeanPostProcessor delegate = new DefaultCamelBeanPostProcessor() {
    @Override
    public CamelContext getOrLookupCamelContext() {
        if (camelContext == null) {
            if (camelId != null) {
                LOG.trace("Looking up CamelContext by id: {} from Spring ApplicationContext: {}", camelId, applicationContext);
                camelContext = applicationContext.getBean(camelId, CamelContext.class);
            } else {
                // lookup by type and grab the single CamelContext if exists
                LOG.trace("Looking up CamelContext by type from Spring ApplicationContext: {}", applicationContext);
                Map<String, CamelContext> contexts = applicationContext.getBeansOfType(CamelContext.class);
                if (contexts != null && contexts.size() == 1) {
                    camelContext = contexts.values().iterator().next();
                }
            }
        }
        return camelContext;
    }

Camel 2.16.2Spring 4.1.5JDK 1.7JDK 1.8

共有1个答案

丌官嘉福
2023-03-14

Thanks@jorge-c,但是使用routeContext我们只需要一个CamelContext。

要在单元测试中使用多上下文,请不要使用CamelSpringTestSupport,因为存在一个bug。

public class BaseSpringTest extends CamelSpringTestSupport {...}

使用“@runwith(SpringJUnit4ClassRunner.class)”

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/camel-my-root-spring-config.xml")
public class BaseSpringJUnit4 
{
  @EndpointInject(uri = "direct:myroute", context="contextB")
  private Endpoint eFooTest;
}
 类似资料:
  • 我有一个通用代码库,需要用不同的实现和运行时配置进行测试。考虑使用多个DAO实现的服务。我有测试Dao接口的通用单元测试(需要Dao自动连接),我想从不同的项目中调用这些测试。 基本上我想要这样的东西。在共享的通用项目中,我的测试将有效。所以本质上,在共享项目中,我有我的测试,例如。 然后在实现Dao的其他项目中,我会: . 同样,有多个项目以不同的方式实现DAO层,我想分享通用测试。 如果我能将

  • 我有一个自定义的useEffect钩子来获取每分钟的当前时间。 我需要一个共同的组件,当日期落在给定的时间范围内,该组件呈现null,否则它将显示。 我还需要另一个不需要date对象的通用组件。 我是否应该创建一个上下文来包含,以便传递道具,然后使使用上下文? 我需要获得状态,从如何传递道具到{this.props.children},我认为使用上下文将作为道具传递给孩子是很好的。 使用上下文获取

  • 我在我的Spring boot应用程序中使用OAuth2RestTemplate,并通过它使用一些资源,因为它封装了所有身份验证信息,所以我可以只发送请求,而不用担心令牌和其他身份验证内容。 在我并行发送请求之前,一切都很好。 由于OAuth2RestTemplate有一个作用域(它是本地的,因为它包含用户的会话相关信息),当我试图在多线程环境中使用它时,我得到以下异常 组织。springfram

  • 我有一个Spring Boot项目,其中定义了几个apiendpoint。我目前正在为每个API编写集成测试。我的测试类注释如下。 现在,对于我的每个测试类,都会设置一个新的上下文来执行它们,这需要时间。我更喜欢将每个apiendpoint的测试用例保存在单独的类中,以便在逻辑上组织它们,但我不希望每次添加新的控制器类和相应的测试类时,我的测试执行时间都会猛增。我在这里做错了什么?

  • 我正在编写集成测试,我想使用事务范围。我们使用EF和带有上下文的存储库。 编辑在评论中我被要求包括更多的代码,然而,我认为没有必要回答我的问题。

  • 我使用JBoss 6,在这个JBoss上部署了两个项目,它们有不同的网络上下文。他们都在后台使用Hibernate和相同的核心包,但我想根据网络上下文区分日志文件。因为核心包是相同的java包为两个项目。 我在互联网上也搜索了log4j手册,但找不到任何方法?