我有一个Springboot应用程序,在其中配置了一些骆驼路线。
public class CamelConfig { private static final Logger LOG = LoggerFactory.getLogger(CamelConfig.class); @Value("${activemq.broker.url:tcp://localhost:61616}") String brokerUrl; @Value("${activemq.broker.maxconnections:1}") int maxConnections; @Bean ConnectionFactory jmsConnectionFactory() { PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(new ActiveMQConnectionFactory(brokerUrl)); pooledConnectionFactory.setMaxConnections(maxConnections); return pooledConnectionFactory; } @Bean public RoutesBuilder route() { LOG.info("Initializing camel routes......................"); return new SpringRouteBuilder() { @Override public void configure() throws Exception { from("activemq:testQueue").to("bean:queueEventHandler?method=handleQueueEvent"); } }; }
}
我想测试一下从activemq:testQueue到queueEventHandler :: handleQueueEvent的路由, 我尝试了这里提到的其他事情http://camel.apache.org/camel- test.html,但是似乎没有起作用。
我正在尝试做这样的事情
@RunWith(SpringRunner.class) @SpringBootTest(classes = {CamelConfig.class, CamelTestContextBootstrapper.class}) public class CamelRouteConfigTest { @Produce(uri = "activemq:testQueue") protected ProducerTemplate template; @Test public void testSendMatchingMessage() throws Exception { template.sendBodyAndHeader("testJson", "foo", "bar"); ..... ..... verify handleQueueEvent method is called on bean queueEventHandler by mocking }
但是我的ProducerTemplate始终为null。我尝试了自动装配Camelcontext,对此我遇到了一个异常,说它无法解析camelContext。但这可以通过将SpringCamelContext.class添加到@SpringBootTest类来解决。但是我的ProducerTemplate仍然为null。
请提出建议。我正在使用骆驼2.18 Springboot 1.4
这就是我最终做到的方式
@RunWith(SpringRunner.class) public class CamelRouteConfigTest extends CamelTestSupport { private static final Logger LOG = LoggerFactory.getLogger(CamelRouteConfigTest.class); private static BrokerService brokerSvc = new BrokerService(); @Mock private QueueEventHandler queueEventHandler; @BeforeClass //Sets up a embedded broker. public static void setUpBroker() throws Exception { brokerSvc.setBrokerName("TestBroker"); brokerSvc.addConnector("tcp://localhost:61616"); brokerSvc.setPersistent(false); brokerSvc.setUseJmx(false); brokerSvc.start(); } @Override protected RoutesBuilder createRouteBuilder() throws Exception { return new CamelConfig().route(); } // properties in .yml has to be loaded manually. Not sure of .properties file @Override protected Properties useOverridePropertiesWithPropertiesComponent() { YamlPropertySourceLoader loader = new YamlPropertySourceLoader(); try { PropertySource<?> applicationYamlPropertySource = loader.load( "properties", new ClassPathResource("application.yml"),null);// null indicated common properties for all profiles. Map source = ((MapPropertySource) applicationYamlPropertySource).getSource(); Properties properties = new Properties(); properties.putAll(source); return properties; } catch (IOException e) { LOG.error("application.yml file cannot be found."); } return null; } @Override protected JndiRegistry createRegistry() throws Exception { JndiRegistry jndi = super.createRegistry(); MockitoAnnotations.initMocks(this); jndi.bind("queueEventHandler", queueEventHandler); return jndi; } @Test // Sleeping for a few seconds is necessary, because this line template.sendBody runs in a different thread and // CamelTest takes a few seconds to do the routing. public void testRoute() throws InterruptedException { template.sendBody("activemq:productpushevent", "HelloWorld!"); Thread.sleep(2000); verify(queueEventHandler, times(1)).handleQueueEvent(any()); } @AfterClass public static void shutDownBroker() throws Exception { brokerSvc.stop(); } }