camel-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Gareth Western (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (CAMEL-8064) MockEndpointsAndSkip annotation does not resolve property placeholders
Date Thu, 20 Nov 2014 12:42:33 GMT

     [ 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)

Mime
View raw message