...
Code Block |
---|
language | java |
---|
title | Required Add required annotations |
---|
|
@Component
@References({
@Reference(name = "camelComponent",referenceInterface = ComponentResolver.class,
cardinality = ReferenceCardinality.MANDATORY_MULTIPLE, policy = ReferencePolicy.DYNAMIC,
policyOption = ReferencePolicyOption.GREEDY, bind = "gotCamelComponent", unbind = "lostCamelComponent")
}) |
Then implement getRouteBuilders()
method which returns the Camel routes you want to run: routes you want to run:
Code Block |
---|
language | java |
---|
title | Load routes |
---|
|
@Override
protected List<RoutesBuilder> getRouteBuilders() {
List<RoutesBuilder> routesBuilders = new ArrayList<>();
routesBuilders.add(new YourRouteBuilderHere(registry));
routesBuilders.add(new AnotherRouteBuilderHere(registry));
return routesBuilders;
} |
And finally provide the default configuration with:
Code Block |
---|
language | java |
---|
title | Configuration in Define configuration with annotations |
---|
|
@Properties({
@Property(name = "camelContextId", value = "my-test"),
@Property(name = "active", value = "true"),
@Property(name = "...", value = "..."),
...
}) |
...
Service Component is a POJO and has no special requirements for (non-OSGi) unit testing. There are however some techniques that are specific to Camel SCR and or just make testing easier.
Below is an example unit test, generated by camel-archetype-scr
:
Code Block |
---|
language | java |
---|
title | CamelScrExampleTest.java |
---|
|
// This file was generated from org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
package example;
import java.util.List;
import org.apache.camel.scr.internal.ScrHelper;
import org.apache.camel.builder.AdviceWithRouteBuilder;
import org.apache.camel.component.mock.MockComponent;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.model.ModelCamelContext;
import org.apache.camel.model.RouteDefinition;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class CamelScrExampleTest {
Logger log = LoggerFactory.getLogger(getClass());
@Rule
public TestName testName = new TestName();
CamelScrExample integration;
ModelCamelContext context;
@Before
public void setUp() throws Exception {
log.info("*******************************************************************");
log.info("Test: " + testName.getMethodName());
log.info("*******************************************************************");
// Set property prefix for unit testing
System.setProperty(CamelScrExample.PROPERTY_PREFIX, "unit");
// Prepare the integration
integration = new CamelScrExample();
integration.prepare(null, ScrHelper.getScrProperties(integration.getClass().getName()));
context = integration.getContext();
// Disable JMX for test
context.disableJMX();
// Fake a component for test
// context.addComponent("amq", new MockComponent());
}
@After
public void tearDown() throws Exception {
integration.stop();
}
@Test
public void testRoutes() throws Exception {
// Adjust routes
List<RouteDefinition> routes = context.getRouteDefinitions();
routes.get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// Replace "from" endpoint with direct:start
replaceFromWith("direct:start");
// Mock and skip result endpoint
mockEndpoints("log:*");
}
});
MockEndpoint resultEndpoint = context.getEndpoint("mock:log:foo", MockEndpoint.class);
// resultEndpoint.expectedMessageCount(1); // If you want to just check the number of messages
resultEndpoint.expectedBodiesReceived("hello"); // If you want to check the contents
// Start the integration
integration.run();
// Send the test message
context.createProducerTemplate().sendBody("direct:start", "hello");
resultEndpoint.assertIsSatisfied();
}
} |
...
This allows you to override parts of the configuration by prefixing properties with "unit.". For example, unit.from
overrides from
for the unit test.
Prefixes, as a whole, can be used to cover the differences between the runtime environments where your routes might run. Moving the unchanged bundle through development, testing and production environments is a typical use case.
Code Block |
---|
language | java |
---|
title | Getting test configuration from annotations |
---|
|
integration.prepare(null, ScrHelper.getScrProperties(integration.getClass().getName())); |
...
Code Block |
---|
language | java |
---|
title | Mocking components for test |
---|
|
// Fake a component for test
// context.addComponent("amq", new MockComponent()); |
...
Camel's AdviceWith feature allows route routes to be modified for test.
Code Block |
---|
language | java |
---|
title | Starting the routes |
---|
|
// Start the integration
integration.run(); |
...