[
https://issues.apache.org/jira/browse/CAMEL-8064?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Gareth Western updated CAMEL-8064:
----------------------------------
Description:
We are using property placeholders in our route configuration in order to
switch components in our unit tests. For example:
{code}
from(MyRouteBuilder.ENTRY_ENDPOINT)
.routeId("some.route")
.process(doSomething())
.to(MyRouteBuilder.EXIT_ENDPOINT);
{code}
Where ENTRY_ENDPOINT = "{{entry.endpoint.uri}}"
and EXIT_ENDPOINT = "{exit.endpoint.uri}}"
Then, in production, the Camel context is initialized with a properties file
where the URIs use the "jms" component, while in our unit tests we initialise
the context with a 'test' properties file where the URIs use the "direct"
component.
A typical RouteBuilder unit test looks something like this:
{code}
@RunWith(CamelSpringJUnit4ClassRunner.class)
@ContextConfiguration(
classes = { MyRouteBuilderTest.TestConfig.class },
loader = CamelSpringDelegatingTestContextLoader.class
)
@MockEndpointsAndSkip(value = "direct:myRouteBuilder.exit")
public class MyRouteBuilderTest {
@Produce(uri = MyRouteBuilder.ENTRY_ENDPOINT)
private ProducerTemplate myRouteBuilderProducer;
@EndpointInject(uri = "mock:" + MyRouteBuilder.EXIT_ENDPOINT)
private MockEndpoint mockOutputServiceEndpoint;
@Autowired
private CamelContext camelContext;
@Test
public void testSomething() {
....
}
@Configuration
public static class TestConfig extends SingleRouteCamelConfiguration {
@Override
protected void setupCamelContext(CamelContext camelContext) throws
Exception {
super.setupCamelContext(camelContext);
PropertiesComponent prop = camelContext.getComponent("properties",
PropertiesComponent.class);
prop.setLocation("myRouteBuilder.test.properties");
}
@Override
public RouteBuilder route() {
return new MyRouteBuilder();
}
}
{code}
The issue we're having is that the @MockEndpointsAndSkip annotation on the test
class does not resolve property placeholders, therefore we have to write the
resolved value instead of the property placeholder value (which is a public
static variable in the RouteBuilder implementation) I.e. we want to use
MyRouteBuilder.EXIT_ENDPOINT instead of "direct:myRouteBuilder.exit".
It would be nicer to avoid having duplicate extra hard-coded Strings if
possible, so that if the endpoint uri value is updated in the property file
then all the tests don't also have to be updated.
was:
We are using property placeholders in our route configuration in order to
switch components in our unit tests. For example:
{code}
from(MyRouteBuilder.ENTRY_ENDPOINT)
.routeId("some.route")
.process(doSomething())
.to(MyRouteBuilder.EXIT_ENDPOINT);
{code}
Where ENTRY_ENDPOINT = "{{entry.endpoint.uri}}"
and EXIT_ENDPOINT = "{exit.endpoint.uri}}"
Then, in production, the Camel context is initialized with a properties file
where the URIs use the "jms" component, while in our unit tests we initialise
the context with a 'test' properties file where the URIs use the "direct"
component.
A typical RouteBuilder unit test looks something like this:
{code}
@RunWith(CamelSpringJUnit4ClassRunner.class)
@ContextConfiguration(
classes = { MyRouteBuilderTest.TestConfig.class },
loader = CamelSpringDelegatingTestContextLoader.class
)
@MockEndpointsAndSkip(value = "direct:myRouteBuilder.exit")
public class MyRouteBuilderTest {
@Produce(uri = MyRouteBuilder.ENTRY_ENDPOINT)
private ProducerTemplate myRouteBuilderProducer;
@EndpointInject(uri = "mock:" + MyRouteBuilder.EXIT_ENDPOINT)
private MockEndpoint mockOutputServiceEndpoint;
@Autowired
private CamelContext camelContext;
@Test
public void testSomething() {
....
}
@Configuration
public static class TestConfig extends SingleRouteCamelConfiguration {
@Override
protected void setupCamelContext(CamelContext camelContext) throws
Exception {
super.setupCamelContext(camelContext);
PropertiesComponent prop = camelContext.getComponent("properties",
PropertiesComponent.class);
prop.setLocation("myRouteBuilder.test.properties");
}
@Override
public RouteBuilder route() {
return new MyRouteBuilder();
}
}
{code}
The issue we're having is that the @MockEndpointsAndSkip annotation on the test
class does not resolve property placeholders, therefore we have to write the
resolved value instead of the property placeholder value (which is a public
static variable in the RouteBuilder implementation e.g.
MyRouteBuilder.EXIT_ENDPOINT).
It would be nicer to avoid having duplicate extra hard-coded Strings if
possible, so that if the endpoint uri value is updated in the property file
then all the tests don't also have to be updated.
> MockEndpointsAndSkip annotation does not resolve property placeholders
> ----------------------------------------------------------------------
>
> Key: CAMEL-8064
> URL: https://issues.apache.org/jira/browse/CAMEL-8064
> Project: Camel
> Issue Type: Improvement
> Affects Versions: 2.13.2
> Reporter: Gareth Western
> Priority: Minor
>
> We are using property placeholders in our route configuration in order to
> switch components in our unit tests. For example:
> {code}
> from(MyRouteBuilder.ENTRY_ENDPOINT)
> .routeId("some.route")
> .process(doSomething())
> .to(MyRouteBuilder.EXIT_ENDPOINT);
> {code}
> Where ENTRY_ENDPOINT = "{{entry.endpoint.uri}}"
> and EXIT_ENDPOINT = "{exit.endpoint.uri}}"
> Then, in production, the Camel context is initialized with a properties file
> where the URIs use the "jms" component, while in our unit tests we initialise
> the context with a 'test' properties file where the URIs use the "direct"
> component.
> A typical RouteBuilder unit test looks something like this:
> {code}
> @RunWith(CamelSpringJUnit4ClassRunner.class)
> @ContextConfiguration(
> classes = { MyRouteBuilderTest.TestConfig.class },
> loader = CamelSpringDelegatingTestContextLoader.class
> )
> @MockEndpointsAndSkip(value = "direct:myRouteBuilder.exit")
> public class MyRouteBuilderTest {
> @Produce(uri = MyRouteBuilder.ENTRY_ENDPOINT)
> private ProducerTemplate myRouteBuilderProducer;
> @EndpointInject(uri = "mock:" + MyRouteBuilder.EXIT_ENDPOINT)
> private MockEndpoint mockOutputServiceEndpoint;
> @Autowired
> private CamelContext camelContext;
> @Test
> public void testSomething() {
> ....
> }
> @Configuration
> public static class TestConfig extends SingleRouteCamelConfiguration {
> @Override
> protected void setupCamelContext(CamelContext camelContext) throws
> Exception {
> super.setupCamelContext(camelContext);
> PropertiesComponent prop =
> camelContext.getComponent("properties", PropertiesComponent.class);
> prop.setLocation("myRouteBuilder.test.properties");
> }
> @Override
> public RouteBuilder route() {
> return new MyRouteBuilder();
> }
> }
> {code}
> The issue we're having is that the @MockEndpointsAndSkip annotation on the
> test class does not resolve property placeholders, therefore we have to write
> the resolved value instead of the property placeholder value (which is a
> public static variable in the RouteBuilder implementation) I.e. we want to
> use MyRouteBuilder.EXIT_ENDPOINT instead of "direct:myRouteBuilder.exit".
> It would be nicer to avoid having duplicate extra hard-coded Strings if
> possible, so that if the endpoint uri value is updated in the property file
> then all the tests don't also have to be updated.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)