代码之家  ›  专栏  ›  技术社区  ›  sairn

Red Hat Fuse7.2单元测试产生了一个令人困惑的运行时异常,即“放弃等待来自捆绑包的BlueprintContainer”

  •  -1
  • sairn  · 技术社区  · 7 年前

    问题:

    下面提供的单元测试失败,并显示以下消息:

    java.lang.RuntimeException: Gave up waiting for BlueprintContainer from bundle "RouteXmlTest"
    

    例外情况是模糊的,没有令人信服的文档或示例来说明如何对这个场景进行单元测试。

    因此,需要帮助:-)

    下面,我列出了我失败的尝试中使用的代码,即用“Camel”扩展测试文件BlueprintTestSupport.java".

    欢迎任何指导/解决方案。

    谢谢!

    这是单元测试类。。。

    src/主/测试/aaa/bbb.ccc.jar/RouteXmlTest.java语言

    package aaa.bbb.ccc.jar;
    
    import java.io.File;
    import java.nio.charset.StandardCharsets;
    import java.nio.file.Files;
    import java.nio.file.Path;
    
    import org.apache.camel.Consume;
    import org.apache.camel.Produce;
    import org.apache.camel.ProducerTemplate;
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.component.mock.MockEndpoint;
    import org.apache.camel.test.blueprint.CamelBlueprintTestSupport;
    //import org.apache.camel.test.junit4.CamelTestSupport;
    import org.junit.Test;
    
    public class RouteXmlTest extends CamelBlueprintTestSupport {  //CamelTestSupport {
    
        protected Object[] expectedBodies = {}; // empty to start
    
        @Produce(uri = "file:work/cbr/input")
        protected ProducerTemplate inputEndpoint;
    
        @Consume(uri = "jms:queue:myFromQueueA")
        protected MockEndpoint myFromQueueA;
    
        @Consume(uri = "jms:queue:myToQueueB")
        protected MockEndpoint myToQueueB;
    
        @Consume(uri = "jms:queue:myToQueueC")
        protected MockEndpoint myToQueueC;
    
        @Consume(uri = "jms:queue:myToQueueD")
        protected MockEndpoint myToQueueD;
    
        @Override
        protected RouteBuilder createRouteBuilder() throws Exception {
            return new CamelRoute();
        }
    
        @Override
        public String isMockEndpoints() {
            return "*";
        }
    
        @Test
        public void testCamelRoute() throws Exception {
            // Define some input data based on the files we have to test against
            String value1 = getFileContents("src/test/resources/data/order1.xml");
            String value2 = getFileContents("src/test/resources/data/order2.xml");
            String value3 = getFileContents("src/test/resources/data/order3.xml");
            String value4 = getFileContents("src/test/resources/data/order4.xml");
            String value5 = getFileContents("src/test/resources/data/order5.xml");
    
            expectedBodies = new Object[]{value1, value2, value3, value4, value5};
    
            // Define some expectations
            getMockEndpoint("mock:jms:queue:myToQueueB").expectedMinimumMessageCount(5);
            getMockEndpoint("mock:jms:queue:myToQueueC").expectedMinimumMessageCount(5);
            getMockEndpoint("mock:jms:queue:myToQueueD").expectedMinimumMessageCount(5);
    
            // Send some messages to input endpoints
            for (Object expectedBody : expectedBodies) {
                inputEndpoint.sendBody(expectedBody);
            }
    
            // Validate our expectations
            assertMockEndpointsSatisfied();
        }
    
        @Override
        protected String getBlueprintDescriptor() {
            return "OSGI-INF/blueprint/camel-route.xml";
        }
    
        private String getFileContents(String path) throws Exception {
            Path filePath = new File(path).toPath();
            return new String(Files.readAllBytes(filePath), StandardCharsets.UTF_8);
        }
    }
    

    这是骆驼-路由.xml...

    src/main/resources/OSGI-INF/blueprint/camel-route

    <?xml version="1.0" encoding="UTF-8"?>
    <blueprint  xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 
                                    https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd              
                                    http://camel.apache.org/schema/blueprint 
                                    http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
    
        <reference id="transactionManager" interface="org.springframework.transaction.PlatformTransactionManager"/>  
    
        <bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
            <property name="connectionFactory">
                <reference interface="javax.jms.ConnectionFactory" />
            </property>
            <property name="transactionManager" ref="transactionManager"/>
        </bean>    
    
        <bean class="aaa.bbb.ccc.jar.CamelRoute" id="myRouteBuilder"/>
    
        <camelContext id="cbr-example-context" xmlns="http://camel.apache.org/schema/blueprint">
            <routeBuilder ref="myRouteBuilder"/>
        </camelContext>
    </blueprint>
    

    下面是尝试单元测试时收到的异常。。。

    -
    -
    -
    -------------------------------------------------------
     T E S T S
    -------------------------------------------------------
    Running aaa.bbb.ccc.jar.RouteXmlTest
    [                          main] CamelBlueprintHelper           INFO  Using Blueprint XML file: /C:/tools/rfhpoc/target/classes/OSGI-INF/blueprint/camel-route.xml
    [                      Thread-0] RawBuilder                     INFO  Copy thread finished.
    [                      Thread-1] RawBuilder                     INFO  Copy thread finished.
    [                          main] Activator                      INFO  Camel activator starting
    [                          main] Activator                      INFO  Camel activator started
    [         Blueprint Extender: 1] BlueprintContainerImpl         INFO  Bundle RouteXmlTest/1.0.0 is waiting for namespace handlers [http://camel.apache.org/schema/blueprint]
    [         Blueprint Extender: 1] BlueprintContainerImpl         INFO  Bundle RouteXmlTest/1.0.0 is waiting for dependencies [(objectClass=javax.jms.ConnectionFactory), (objectClass=org.springframework.transaction.PlatformTransactionManager)]
    [                          main] RouteXmlTest                   INFO  ********************************************************************************
    [                          main] RouteXmlTest                   INFO  Testing done: testCamelRoute(aaa.bbb.ccc.jar.RouteXmlTest)
    [                          main] RouteXmlTest                   INFO  Took: 32.815 seconds (32815 millis)
    [                          main] RouteXmlTest                   INFO  ********************************************************************************
    [                          main] CamelBlueprintHelper           INFO  Deleting work directory target/bundles/1549574455436
    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 33.338 s <<< FAILURE! - in aaa.bbb.ccc.jar.RouteXmlTest
    testCamelRoute(aaa.bbb.ccc.jar.RouteXmlTest)  Time elapsed: 32.952 s  <<< ERROR!
    java.lang.RuntimeException: Gave up waiting for BlueprintContainer from bundle "RouteXmlTest"
    
    
    Results:
    
    Errors: 
      RouteXmlTest>CamelBlueprintTestSupport.setUp:241->CamelBlueprintTestSupport.createBundleContext:175 » Runtime
    
    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0
    
    ------------------------------------------------------------------------
    BUILD FAILURE
    ------------------------------------------------------------------------
    Total time: 01:13 min
    Finished at: 2019-02-07T16:21:28-05:00
    ------------------------------------------------------------------------
    -
    -
    -
    

    以下其他相关文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <modelVersion>4.0.0</modelVersion>
        <groupId>aaa.bbb.ccc</groupId>
        <artifactId>rfhpoc</artifactId>
        <version>1.0</version>
        <packaging>bundle</packaging>
        <name>rfhpoc</name>
        <description>rfhpoc - show dsl routing from queue to multiple queues ("spray")</description>
        <licenses>
            <license>
                <name>Apache License, Version 2.0</name>
                <url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
                <distribution>repo</distribution>
            </license>
        </licenses>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <maven.test.skip>false</maven.test.skip>
        </properties>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.jboss.redhat-fuse</groupId>
                    <artifactId>fuse-karaf-bom</artifactId>
                    <version>7.1.0.fuse-710019-redhat-00002</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-core</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>artemis-core-client</artifactId>
            </dependency> 
            <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>artemis-jms-client</artifactId>
            </dependency>  
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-jms</artifactId>
            </dependency>     
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-blueprint</artifactId>
                <scope>provided</scope> <!--***-->
            </dependency>                    
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12.0.redhat-003</version>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-test-blueprint</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <build>
            <defaultGoal>install</defaultGoal>
            <plugins>
                <plugin>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>maven-bundle-plugin</artifactId>
                    <version>3.2.0</version>
                    <extensions>true</extensions>
                    <configuration>
                        <instructions>
                            <Bundle-SymbolicName>rfhpoc</Bundle-SymbolicName>
                            <Bundle-Name>rfhpoc</Bundle-Name>
                        </instructions>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.7.0</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.1.0</version>
                    <configuration>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    src/main/java/aaa.bbb.ccc公司.震击器/骆驼路线.java

    package aaa.bbb.ccc.jar;
    
    import org.apache.camel.builder.RouteBuilder;
    
    public class CamelRoute extends RouteBuilder {
    
        @Override
        public void configure() throws Exception {
    
            System.getProperties().list(System.out);
    
            from("file:work/cbr/input")
                    .log("from ${file:name}")
                    .to("jms:queue:myFromQueueA");
    
            from("jms:queue:myFromQueueA")
                    //.transacted()
                    .log("from jms:queue:myFromQueueA")
                    .to("jms:queue:myToQueueB")
                    .to("jms:queue:myToQueueC")
                    .to("jms:queue:myToQueueD");                
        }   
    }
    

    环境

    red hat fuse 7.2
    java 8
    active mq 7.2.3
    apache maven 3.5.3
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Yuriy Denisov    7 年前

    我在CamelBlueprintTestSupport测试中也遇到了类似的错误。在我通过使用下面的代码将事务处理行为添加到蓝图.xml发生文件错误。

    <reference id="osgiPlatformTransactionManager" interface="org.springframework.transaction.PlatformTransactionManager" />
    
    <bean id="XA_TX_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="osgiPlatformTransactionManager"/>
    </bean>
    
    <route id="transactedRoute">
       <from uri="direct:transactedRoute" />
       ...
       <transacted ref="XA_TX_REQUIRED"/>
       ...
    </route>