You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Doug Turnbull <dt...@opensourceconnections.com> on 2014/04/04 21:09:18 UTC

Using AdviceWith not intercepting when I send real Files through

Hello,

I'm attempting to use AdviceWith for testing a route The route looks like:

    from("file:inbox?doneFile=done")
    .unmarshall(csv)
    .split(body())
         .to("direct:csvRecords")

I've written a test that attempts to confirm that files get unmarshalled to
csv correctly and are sent to my mocked direct:csvRecords endpoint. As
such, my test looks like what is recommended from the Camel mock page
https://camel.apache.org/mock.html. The main difference is I'm sending
through real files, but treating direct:csvRecords as a mock to confirm
correct behavior.

public void mockAllEndpoints() throws Exception {
AdviceWithRouteBuilder mockDirect = new AdviceWithRouteBuilder() {

@Override
public void configure() throws Exception {
// mock the for testing
mockEndpoints();
}
 };
context.getRouteDefinitions().get(0)
.adviceWith(context, mockDirect);
}

Then in my test I have:

@Test
public void testReadCsvFileWhenDoneFile() throws Exception {
mockAllEndpoints();
MockEndpoint mockDirectCsv = getMockEndpoint("mock:direct:csvRecords");
File testCsv = new File("test.csv");
assertTrue(testCsv.exists());
 mockDirectCsv.expectedMessageCount(3);
FileUtils.copyFile(testCsv, new File("inbox/test.csv"));
FileUtils.touch(new File("inbox/done"));
Thread.sleep(100);
// Confirm nothing's been processed
mockDirectCsv.assertIsSatisfied();
}


The "assertIsSatisfied" fails because the expectation isn't met. I can
confirm that CSV deserialization and processing is happening because if I
add a .process() and to a println, I see all three csv records in that file
come out fine. I'd just like to be able to build tests around expected
behavior for my routes.

As far as I can tell the mock endpoint isn't getting hit with messages. If
I put a breakpoint in the mock endpoint code where the message counter is
incremented, it is never hit. So the assertIsSatisfied fails due to not
enough messages being brought through.

(I'm running Camel 2.12.3 on Windows 7. Java 7)

Thanks

-- 
Doug Turnbull
Search & Big Data Architect
OpenSource Connections <http://o19s.com>

Re: Using AdviceWith not intercepting when I send real Files through

Posted by Claus Ibsen <cl...@gmail.com>.
On Fri, Apr 25, 2014 at 4:42 PM, Doug Turnbull
<dt...@opensourceconnections.com> wrote:
> Hey Claus,
>
> Sorry for my late reply. It turns out that I was not setting
> "isUsingAdviceWith" in my Camel tests to prevent the routes from starting
> before my mocking. Here's a blog post with this and other discoveries
> writing unit tests:
>
> http://www.opensourceconnections.com/2014/04/24/correctly-using-camels-advicewith-in-unit-tests/
>

Hi

Thanks for sharing this great blog post. I am adding a link to it from
our link collection at
http://camel.apache.org/articles

> Thanks
> -Doug
>
>
>
> On Sat, Apr 5, 2014 at 2:33 AM, Claus Ibsen <cl...@gmail.com> wrote:
>
>> You should see an INFO logging with the endpoints being mocked during
>> the advice process.
>> Don't you see that?
>>
>> On Fri, Apr 4, 2014 at 9:09 PM, Doug Turnbull
>> <dt...@opensourceconnections.com> wrote:
>> > Hello,
>> >
>> > I'm attempting to use AdviceWith for testing a route The route looks
>> like:
>> >
>> >     from("file:inbox?doneFile=done")
>> >     .unmarshall(csv)
>> >     .split(body())
>> >          .to("direct:csvRecords")
>> >
>> > I've written a test that attempts to confirm that files get unmarshalled
>> to
>> > csv correctly and are sent to my mocked direct:csvRecords endpoint. As
>> > such, my test looks like what is recommended from the Camel mock page
>> > https://camel.apache.org/mock.html. The main difference is I'm sending
>> > through real files, but treating direct:csvRecords as a mock to confirm
>> > correct behavior.
>> >
>> > public void mockAllEndpoints() throws Exception {
>> > AdviceWithRouteBuilder mockDirect = new AdviceWithRouteBuilder() {
>> >
>> > @Override
>> > public void configure() throws Exception {
>> > // mock the for testing
>> > mockEndpoints();
>> > }
>> >  };
>> > context.getRouteDefinitions().get(0)
>> > .adviceWith(context, mockDirect);
>> > }
>> >
>> > Then in my test I have:
>> >
>> > @Test
>> > public void testReadCsvFileWhenDoneFile() throws Exception {
>> > mockAllEndpoints();
>> > MockEndpoint mockDirectCsv = getMockEndpoint("mock:direct:csvRecords");
>> > File testCsv = new File("test.csv");
>> > assertTrue(testCsv.exists());
>> >  mockDirectCsv.expectedMessageCount(3);
>> > FileUtils.copyFile(testCsv, new File("inbox/test.csv"));
>> > FileUtils.touch(new File("inbox/done"));
>> > Thread.sleep(100);
>> > // Confirm nothing's been processed
>> > mockDirectCsv.assertIsSatisfied();
>> > }
>> >
>> >
>> > The "assertIsSatisfied" fails because the expectation isn't met. I can
>> > confirm that CSV deserialization and processing is happening because if I
>> > add a .process() and to a println, I see all three csv records in that
>> file
>> > come out fine. I'd just like to be able to build tests around expected
>> > behavior for my routes.
>> >
>> > As far as I can tell the mock endpoint isn't getting hit with messages.
>> If
>> > I put a breakpoint in the mock endpoint code where the message counter is
>> > incremented, it is never hit. So the assertIsSatisfied fails due to not
>> > enough messages being brought through.
>> >
>> > (I'm running Camel 2.12.3 on Windows 7. Java 7)
>> >
>> > Thanks
>> >
>> > --
>> > Doug Turnbull
>> > Search & Big Data Architect
>> > OpenSource Connections <http://o19s.com>
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> Red Hat, Inc.
>> Email: cibsen@redhat.com
>> Twitter: davsclaus
>> Blog: http://davsclaus.com
>> Author of Camel in Action: http://www.manning.com/ibsen
>> Make your Camel applications look hawt, try: http://hawt.io
>>
>
>
>
> --
> Doug Turnbull
> Search & Big Data Architect
> OpenSource Connections <http://o19s.com>



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
Email: cibsen@redhat.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
hawtio: http://hawt.io/
fabric8: http://fabric8.io/

Re: Using AdviceWith not intercepting when I send real Files through

Posted by Doug Turnbull <dt...@opensourceconnections.com>.
Hey Claus,

Sorry for my late reply. It turns out that I was not setting
"isUsingAdviceWith" in my Camel tests to prevent the routes from starting
before my mocking. Here's a blog post with this and other discoveries
writing unit tests:

http://www.opensourceconnections.com/2014/04/24/correctly-using-camels-advicewith-in-unit-tests/

Thanks
-Doug



On Sat, Apr 5, 2014 at 2:33 AM, Claus Ibsen <cl...@gmail.com> wrote:

> You should see an INFO logging with the endpoints being mocked during
> the advice process.
> Don't you see that?
>
> On Fri, Apr 4, 2014 at 9:09 PM, Doug Turnbull
> <dt...@opensourceconnections.com> wrote:
> > Hello,
> >
> > I'm attempting to use AdviceWith for testing a route The route looks
> like:
> >
> >     from("file:inbox?doneFile=done")
> >     .unmarshall(csv)
> >     .split(body())
> >          .to("direct:csvRecords")
> >
> > I've written a test that attempts to confirm that files get unmarshalled
> to
> > csv correctly and are sent to my mocked direct:csvRecords endpoint. As
> > such, my test looks like what is recommended from the Camel mock page
> > https://camel.apache.org/mock.html. The main difference is I'm sending
> > through real files, but treating direct:csvRecords as a mock to confirm
> > correct behavior.
> >
> > public void mockAllEndpoints() throws Exception {
> > AdviceWithRouteBuilder mockDirect = new AdviceWithRouteBuilder() {
> >
> > @Override
> > public void configure() throws Exception {
> > // mock the for testing
> > mockEndpoints();
> > }
> >  };
> > context.getRouteDefinitions().get(0)
> > .adviceWith(context, mockDirect);
> > }
> >
> > Then in my test I have:
> >
> > @Test
> > public void testReadCsvFileWhenDoneFile() throws Exception {
> > mockAllEndpoints();
> > MockEndpoint mockDirectCsv = getMockEndpoint("mock:direct:csvRecords");
> > File testCsv = new File("test.csv");
> > assertTrue(testCsv.exists());
> >  mockDirectCsv.expectedMessageCount(3);
> > FileUtils.copyFile(testCsv, new File("inbox/test.csv"));
> > FileUtils.touch(new File("inbox/done"));
> > Thread.sleep(100);
> > // Confirm nothing's been processed
> > mockDirectCsv.assertIsSatisfied();
> > }
> >
> >
> > The "assertIsSatisfied" fails because the expectation isn't met. I can
> > confirm that CSV deserialization and processing is happening because if I
> > add a .process() and to a println, I see all three csv records in that
> file
> > come out fine. I'd just like to be able to build tests around expected
> > behavior for my routes.
> >
> > As far as I can tell the mock endpoint isn't getting hit with messages.
> If
> > I put a breakpoint in the mock endpoint code where the message counter is
> > incremented, it is never hit. So the assertIsSatisfied fails due to not
> > enough messages being brought through.
> >
> > (I'm running Camel 2.12.3 on Windows 7. Java 7)
> >
> > Thanks
> >
> > --
> > Doug Turnbull
> > Search & Big Data Architect
> > OpenSource Connections <http://o19s.com>
>
>
>
> --
> Claus Ibsen
> -----------------
> Red Hat, Inc.
> Email: cibsen@redhat.com
> Twitter: davsclaus
> Blog: http://davsclaus.com
> Author of Camel in Action: http://www.manning.com/ibsen
> Make your Camel applications look hawt, try: http://hawt.io
>



-- 
Doug Turnbull
Search & Big Data Architect
OpenSource Connections <http://o19s.com>

Re: Using AdviceWith not intercepting when I send real Files through

Posted by Claus Ibsen <cl...@gmail.com>.
You should see an INFO logging with the endpoints being mocked during
the advice process.
Don't you see that?

On Fri, Apr 4, 2014 at 9:09 PM, Doug Turnbull
<dt...@opensourceconnections.com> wrote:
> Hello,
>
> I'm attempting to use AdviceWith for testing a route The route looks like:
>
>     from("file:inbox?doneFile=done")
>     .unmarshall(csv)
>     .split(body())
>          .to("direct:csvRecords")
>
> I've written a test that attempts to confirm that files get unmarshalled to
> csv correctly and are sent to my mocked direct:csvRecords endpoint. As
> such, my test looks like what is recommended from the Camel mock page
> https://camel.apache.org/mock.html. The main difference is I'm sending
> through real files, but treating direct:csvRecords as a mock to confirm
> correct behavior.
>
> public void mockAllEndpoints() throws Exception {
> AdviceWithRouteBuilder mockDirect = new AdviceWithRouteBuilder() {
>
> @Override
> public void configure() throws Exception {
> // mock the for testing
> mockEndpoints();
> }
>  };
> context.getRouteDefinitions().get(0)
> .adviceWith(context, mockDirect);
> }
>
> Then in my test I have:
>
> @Test
> public void testReadCsvFileWhenDoneFile() throws Exception {
> mockAllEndpoints();
> MockEndpoint mockDirectCsv = getMockEndpoint("mock:direct:csvRecords");
> File testCsv = new File("test.csv");
> assertTrue(testCsv.exists());
>  mockDirectCsv.expectedMessageCount(3);
> FileUtils.copyFile(testCsv, new File("inbox/test.csv"));
> FileUtils.touch(new File("inbox/done"));
> Thread.sleep(100);
> // Confirm nothing's been processed
> mockDirectCsv.assertIsSatisfied();
> }
>
>
> The "assertIsSatisfied" fails because the expectation isn't met. I can
> confirm that CSV deserialization and processing is happening because if I
> add a .process() and to a println, I see all three csv records in that file
> come out fine. I'd just like to be able to build tests around expected
> behavior for my routes.
>
> As far as I can tell the mock endpoint isn't getting hit with messages. If
> I put a breakpoint in the mock endpoint code where the message counter is
> incremented, it is never hit. So the assertIsSatisfied fails due to not
> enough messages being brought through.
>
> (I'm running Camel 2.12.3 on Windows 7. Java 7)
>
> Thanks
>
> --
> Doug Turnbull
> Search & Big Data Architect
> OpenSource Connections <http://o19s.com>



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
Email: cibsen@redhat.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
Make your Camel applications look hawt, try: http://hawt.io