You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2016/03/10 12:08:22 UTC

[2/2] camel git commit: Camel testing Asciidoc documentation

Camel testing Asciidoc documentation


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e636d766
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e636d766
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e636d766

Branch: refs/heads/master
Commit: e636d766685a7baf3722652d402c20241821801d
Parents: bf191d4
Author: Antonin Stefanutti <an...@stefanutti.fr>
Authored: Thu Mar 10 11:54:17 2016 +0100
Committer: Antonin Stefanutti <an...@stefanutti.fr>
Committed: Thu Mar 10 12:08:05 2016 +0100

----------------------------------------------------------------------
 .../spring/javaconfig/patterns/FilterTest.java  |   3 +-
 ...elSpringDelegatingTestContextLoaderTest.java |   2 +
 .../camel/spring/patterns/FilterTest.java       |   2 +
 .../spring/patterns/FilterTest-context.xml      |   2 +
 .../test/blueprint/DebugBlueprintTest.java      |   4 +-
 .../camel/test/blueprint/camelContext.xml       |   2 +
 .../CamelSpringJUnit4ClassRunnerPlainTest.java  |   2 +
 .../apache/camel/test/patterns/FilterTest.java  |   2 +
 docs/user-manual/en/SUMMARY.md                  |   2 +-
 docs/user-manual/en/testing.adoc                | 277 +++++++++++++++++++
 10 files changed, 295 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/e636d766/components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/patterns/FilterTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/patterns/FilterTest.java b/components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/patterns/FilterTest.java
index cb70902..55b2500 100644
--- a/components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/patterns/FilterTest.java
+++ b/components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/patterns/FilterTest.java
@@ -38,7 +38,7 @@ import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
  * @version 
  */
 // START SNIPPET: example
-
+// tag::example[]
 @RunWith(CamelSpringJUnit4ClassRunner.class)
 @ContextConfiguration(classes = {FilterTest.ContextConfig.class}, loader = CamelSpringDelegatingTestContextLoader.class)
 public class FilterTest extends AbstractJUnit4SpringContextTests {
@@ -83,5 +83,6 @@ public class FilterTest extends AbstractJUnit4SpringContextTests {
         }
     }
 }
+// end::example[]
 // END SNIPPET: example
 

http://git-wip-us.apache.org/repos/asf/camel/blob/e636d766/components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/test/CamelSpringDelegatingTestContextLoaderTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/test/CamelSpringDelegatingTestContextLoaderTest.java b/components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/test/CamelSpringDelegatingTestContextLoaderTest.java
index 4150fc3..975008a 100644
--- a/components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/test/CamelSpringDelegatingTestContextLoaderTest.java
+++ b/components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/test/CamelSpringDelegatingTestContextLoaderTest.java
@@ -36,6 +36,7 @@ import org.springframework.test.context.ContextConfiguration;
  * 
  */
 //START SNIPPET: example
+// tag::example[]
 @RunWith(CamelSpringJUnit4ClassRunner.class)
 @ContextConfiguration(
         classes = {CamelSpringDelegatingTestContextLoaderTest.TestConfig.class},
@@ -82,5 +83,6 @@ public class CamelSpringDelegatingTestContextLoaderTest {
         errorEndpoint.assertIsSatisfied();
     }
 }
+// end::example[]
 //END SNIPPET: example
 

http://git-wip-us.apache.org/repos/asf/camel/blob/e636d766/components/camel-spring/src/test/java/org/apache/camel/spring/patterns/FilterTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/patterns/FilterTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/patterns/FilterTest.java
index 0a71c3c..63e22c9 100644
--- a/components/camel-spring/src/test/java/org/apache/camel/spring/patterns/FilterTest.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/patterns/FilterTest.java
@@ -31,6 +31,7 @@ import org.springframework.test.context.ContextConfiguration;
  * @version 
  */
 // START SNIPPET: example
+// tag::example[]
 @ContextConfiguration
 public class FilterTest extends SpringRunWithTestSupport {
 
@@ -62,4 +63,5 @@ public class FilterTest extends SpringRunWithTestSupport {
         resultEndpoint.assertIsSatisfied();
     }
 }
+// end::example[]
 // END SNIPPET: example

http://git-wip-us.apache.org/repos/asf/camel/blob/e636d766/components/camel-spring/src/test/resources/org/apache/camel/spring/patterns/FilterTest-context.xml
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/patterns/FilterTest-context.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/patterns/FilterTest-context.xml
index 8b3ac5d..e7939f4 100644
--- a/components/camel-spring/src/test/resources/org/apache/camel/spring/patterns/FilterTest-context.xml
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/patterns/FilterTest-context.xml
@@ -16,6 +16,7 @@
     limitations under the License.
 -->
 <!-- START SNIPPET: example -->
+<!-- tag::example[] -->
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
@@ -35,4 +36,5 @@
   </camelContext>
 
 </beans>
+<!-- end::example[] -->
 <!-- END SNIPPET: example -->

http://git-wip-us.apache.org/repos/asf/camel/blob/e636d766/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/DebugBlueprintTest.java
----------------------------------------------------------------------
diff --git a/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/DebugBlueprintTest.java b/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/DebugBlueprintTest.java
index 8b39378..9849f4c 100644
--- a/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/DebugBlueprintTest.java
+++ b/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/DebugBlueprintTest.java
@@ -21,6 +21,7 @@ import org.apache.camel.model.ProcessorDefinition;
 import org.junit.Test;
 
 // START SNIPPET: example
+// tag::example[]
 // to use camel-test-blueprint, then extend the CamelBlueprintTestSupport class,
 // and add your unit tests methods as shown below.
 public class DebugBlueprintTest extends CamelBlueprintTestSupport {
@@ -33,7 +34,7 @@ public class DebugBlueprintTest extends CamelBlueprintTestSupport {
     protected String getBlueprintDescriptor() {
         return "org/apache/camel/test/blueprint/camelContext.xml";
     }
-   
+
     // here we have regular JUnit @Test method
     @Test
     public void testRoute() throws Exception {
@@ -70,4 +71,5 @@ public class DebugBlueprintTest extends CamelBlueprintTestSupport {
         debugAfterMethodCalled = true;
     }
 }
+// end::example[]
 // END SNIPPET: example

http://git-wip-us.apache.org/repos/asf/camel/blob/e636d766/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/camelContext.xml
----------------------------------------------------------------------
diff --git a/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/camelContext.xml b/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/camelContext.xml
index f255b41..ad699aa 100644
--- a/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/camelContext.xml
+++ b/components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/camelContext.xml
@@ -16,6 +16,7 @@
     limitations under the License.
 -->
 <!-- START SNIPPET: example -->
+<!-- tag::example[] -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="
@@ -34,4 +35,5 @@
   </camelContext>
 
 </blueprint>
+<!-- end::example[] -->
 <!-- END SNIPPET: example -->

http://git-wip-us.apache.org/repos/asf/camel/blob/e636d766/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringJUnit4ClassRunnerPlainTest.java
----------------------------------------------------------------------
diff --git a/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringJUnit4ClassRunnerPlainTest.java b/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringJUnit4ClassRunnerPlainTest.java
index 8b1504f..1e21c11 100644
--- a/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringJUnit4ClassRunnerPlainTest.java
+++ b/components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringJUnit4ClassRunnerPlainTest.java
@@ -40,6 +40,7 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 // START SNIPPET: e1
+// tag::example[]
 @RunWith(CamelSpringJUnit4ClassRunner.class)
 // must tell Spring to bootstrap with Camel
 @BootstrapWith(CamelTestContextBootstrapper.class)
@@ -124,4 +125,5 @@ public class CamelSpringJUnit4ClassRunnerPlainTest {
         assertTrue(camelContext2.isLazyLoadTypeConverters());
     }
 }
+// end::example[]
 // END SNIPPET: e1

http://git-wip-us.apache.org/repos/asf/camel/blob/e636d766/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterTest.java
----------------------------------------------------------------------
diff --git a/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterTest.java b/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterTest.java
index 65ef132..51748f9 100644
--- a/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterTest.java
+++ b/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterTest.java
@@ -30,6 +30,7 @@ import org.junit.Test;
  * @version 
  */
 // START SNIPPET: example
+// tag::example[]
 public class FilterTest extends CamelTestSupport {
 
     @EndpointInject(uri = "mock:result")
@@ -72,4 +73,5 @@ public class FilterTest extends CamelTestSupport {
         };
     }
 }
+// end::example[]
 // END SNIPPET: example

http://git-wip-us.apache.org/repos/asf/camel/blob/e636d766/docs/user-manual/en/SUMMARY.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md
index 2dce1fe..ed0d028 100644
--- a/docs/user-manual/en/SUMMARY.md
+++ b/docs/user-manual/en/SUMMARY.md
@@ -149,5 +149,5 @@
 
 * User Guide
     * [Karaf](karaf.adoc)
-    * Testing
+    * [Testing](testing.adoc)
         * [CDI Testing](cdi-testing.adoc)

http://git-wip-us.apache.org/repos/asf/camel/blob/e636d766/docs/user-manual/en/testing.adoc
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/testing.adoc b/docs/user-manual/en/testing.adoc
new file mode 100644
index 0000000..7281614
--- /dev/null
+++ b/docs/user-manual/en/testing.adoc
@@ -0,0 +1,277 @@
+ifdef::env-github[]
+:icon-frown: :frowning:
+:icon-smile: :smiley:
+endif::[]
+ifndef::env-github[]
+:icons: font
+:icon-frown: icon:frown-o[fw,role=yellow]
+:icon-smile: icon:smile-o[fw,role=yellow]
+endif::[]
+
+[[Testing-Testing]]
+Testing
+~~~~~~~
+
+Testing is a crucial activity in any piece of software development or
+integration. Typically Camel Riders use various different
+link:components.html[technologies] wired together in a variety of
+link:enterprise-integration-patterns.html[patterns] with different
+link:languages.html[expression languages] together with different forms
+of link:bean-integration.html[Bean Integration] and
+link:dependency-injection.html[Dependency Injection] so its very easy
+for things to go wrong! {icon-frown}. Testing is the crucial weapon to ensure
+that things work as you would expect {icon-smile}.
+
+Camel is a Java library so you can easily wire up tests in whatever unit
+testing framework you use (JUnit 3.x (deprecated), 4.x, or TestNG).
+However the Camel project has tried to make the testing of Camel as easy
+and powerful as possible so we have introduced the following features.
+
+[[Testing-Testingmechanisms]]
+Testing mechanisms
+^^^^^^^^^^^^^^^^^^
+
+The following mechanisms are supported
+
+[width="100%",cols="1,1m,4",options="header",]
+|=======================================================================
+|Name |Component |Description
+|link:camel-test.html[Camel Test] |camel-test |Is a standalone Java
+library letting you easily create Camel test cases using a single Java
+class for all your configuration and routing without using
+link:spring.html[Spring] or link:guice.html[Guice] for
+link:dependency-injection.html[Dependency Injection] which does not
+require an in-depth knowledge of Spring + Spring Test or Guice.
+ Supports JUnit 3.x (deprecated) and JUnit 4.x based tests.
+
+|link:spring-testing.html[Spring Testing] |camel-test-spring |Supports
+JUnit 3.x (deprecated) or JUnit 4.x based tests that bootstrap a test
+environment using Spring without needing to be familiar with Spring
+Test. The  plain JUnit 3.x/4.x based tests work very similar to the
+test support classes in `camel-test`. Also supports Spring Test based
+tests that use the declarative style of test configuration and injection
+common in Spring Test. The Spring Test based tests provide feature
+parity with the plain JUnit 3.x/4.x based testing approach.  Notice
+`camel-test-spring` is a new component in *Camel 2.10* onwards. For
+older Camel release use `camel-test` which has built-in
+link:spring-testing.html[Spring Testing].
+
+|link:blueprint-testing.html[Blueprint Testing] |camel-test-blueprint
+|*Camel 2.10:* Provides the ability to do unit testing on blueprint
+configurations
+
+|link:guice.html[Guice] |camel-guice |Uses link:guice.html[Guice] to
+dependency inject your test classes
+
+|Camel TestNG |camel-testng |Supports plain TestNG based tests with or
+without link:spring.html[Spring] or link:guice.html[Guice] for link:dependency-injection.html[Dependency
+Injection] which does not require an in-depth knowledge of Spring +
+Spring Test or Guice. Also from *Camel 2.10* onwards, this component
+supports Spring Test based tests that use the declarative style of test
+configuration and injection common in Spring Test and described in more
+detail under link:spring-testing.html[Spring Testing].
+|=======================================================================
+
+In all approaches the test classes look pretty much the same in that
+they all reuse the link:bean-integration.html[Camel binding and
+injection annotations].
+
+[[Testing-CamelTestExample]]
+Camel Test Example
+++++++++++++++++++
+
+Here is the link:camel-test.html[Camel Test]
+link:../../../components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterTest.java[example]:
+
+[source,java]
+----
+include::../../../components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterTest.java[tags=example]
+----
+
+Notice how it derives from the Camel helper class `CamelTestSupport` but
+has no Spring or Guice dependency injection configuration but instead
+overrides the `createRouteBuilder()` method.
+
+[[Testing-SpringTestwithXMLConfigExample]]
+Spring Test with XML Config Example
++++++++++++++++++++++++++++++++++++
+
+Here is the link:spring-testing.html[Spring Testing]
+link:../../../components/camel-spring/src/test/java/org/apache/camel/spring/patterns/FilterTest.java[example
+using XML Config]:
+
+[source,java]
+----
+include::../../../components/camel-spring/src/test/java/org/apache/camel/spring/patterns/FilterTest.java[tags=example]
+----
+
+Notice that we use @`DirtiesContext` on the test methods to force
+link:spring-testing.html[Spring Testing] to automatically reload the
+link:camelcontext.html[`CamelContext`] after each test method - this
+ensures that the tests don't clash with each other (e.g. one test method
+sending to an endpoint that is then reused in another test method).
+
+Also notice the use of `@ContextConfiguration` to indicate that by
+default we should look for the
+link:../../../components/camel-spring/src/test/resources/org/apache/camel/spring/patterns/FilterTest-context.xml[`FilterTest-context.xml`
+on the classpath] to configure the test case which looks like this:
+
+[source,xml]
+----
+include::../../../components/camel-spring/src/test/resources/org/apache/camel/spring/patterns/FilterTest-context.xml[tags=example]
+----
+
+[[Testing-SpringTestwithJavaConfigExample]]
+Spring Test with Java Config Example
+++++++++++++++++++++++++++++++++++++
+
+Here is the link:spring-testing.html[Spring Testing]
+link:../../../components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/patterns/FilterTest.java[example
+using Java Config]:
+
+[source,java]
+----
+include::../../../components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/patterns/FilterTest.java[tags=example]
+----
+
+For more information see link:spring-java-config.html[Spring Java
+Config].
+
+This is similar to the XML Config example above except that there is no
+XML file and instead the nested `ContextConfig` class does all of the
+configuration; so your entire test case is contained in a single Java
+class. We currently have to reference by class name this class in the
+`@ContextConfiguration` which is a bit ugly. Please vote for
+http://jira.springframework.org/browse/SJC-238[SJC-238] to address this
+and make Spring Test work more cleanly with Spring JavaConfig.
+
+It's totally optional but for the `ContextConfig` implementation we derive
+from `SingleRouteCamelConfiguration` which is a helper Spring Java
+Config class which will configure the CamelContext for us and then
+register the RouteBuilder we create.
+
+Since *Camel 2.11.0* you can use the `CamelSpringJUnit4ClassRunner` with
+`CamelSpringDelegatingTestContextLoader` like
+link:../../../components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/test/CamelSpringDelegatingTestContextLoaderTest.java[example
+using Java Config with `CamelSpringJUnit4ClassRunner`]:
+
+[source,java]
+----
+include::../../../components/camel-spring-javaconfig/src/test/java/org/apache/camel/spring/javaconfig/test/CamelSpringDelegatingTestContextLoaderTest.java[tags=example]
+----
+
+[[Testing-SpringTestwithXMLConfigandDeclarativeConfigurationExample]]
+Spring Test with XML Config and Declarative Configuration Example
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+Here is a Camel test support enhanced link:spring-testing.html[Spring
+Testing] link:../../../components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringJUnit4ClassRunnerPlainTest.java[example
+using XML Config and pure Spring Test based configuration of the Camel
+Context]:
+
+[source,java]
+----
+include::../../../components/camel-test-spring/src/test/java/org/apache/camel/test/spring/CamelSpringJUnit4ClassRunnerPlainTest.java[tags=example]
+----
+
+Notice how a custom test runner is used with the `@RunWith` annotation
+to support the features of `CamelTestSupport` through annotations on
+the test class.  See link:spring-testing.html[Spring Testing] for a list
+of annotations you can use in your tests.
+
+[[Testing-BlueprintTest]]
+Blueprint Test
+++++++++++++++
+
+Here is the link:blueprint-testing.html[Blueprint Testing]
+link:../../../components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/DebugBlueprintTest.java[example
+using XML Config]:
+
+[source,java]
+----
+include::../../../components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/DebugBlueprintTest.java[tags=example]
+----
+
+Also notice the use of `getBlueprintDescriptors` to indicate that by
+default we should look for the
+link:camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/camelContext.xml[`camelContext.xml`
+in the package] to configure the test case which looks like this:
+
+[source,xml]
+----
+include::../../../components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/camelContext.xml[tags=example]
+----
+
+[[Testing-Testingendpoints]]
+Testing endpoints
+^^^^^^^^^^^^^^^^^
+
+Camel provides a number of endpoints which can make testing easier.
+
+[width="100%",cols="1,3",options="header",]
+|=======================================================================
+|Name |Description
+|link:dataset.html[DataSet] |For load & soak testing this endpoint
+provides a way to create huge numbers of messages for sending to
+link:components.html[Components] and asserting that they are consumed
+correctly
+
+|link:mock.html[Mock] |For testing routes and mediation rules using
+mocks and allowing assertions to be added to an endpoint
+
+|link:test.html[Test] |Creates a link:mock.html[Mock] endpoint which
+expects to receive all the message bodies that could be polled from the
+given underlying endpoint
+|=======================================================================
+
+The main endpoint is the link:mock.html[Mock] endpoint which allows
+expectations to be added to different endpoints; you can then run your
+tests and assert that your expectations are met at the end.
+
+[[Testing-Stubbingoutphysicaltransporttechnologies]]
+Stubbing out physical transport technologies
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If you wish to test out a route but want to avoid actually using a real
+physical transport (for example to unit test a transformation route
+rather than performing a full integration test) then the following
+endpoints can be useful:
+
+[width="100%",cols="1,3",options="header",]
+|=======================================================================
+|Name |Description
+|link:direct.html[Direct] |Direct invocation of the consumer from the
+producer so that single threaded (non-SEDA) in VM invocation is
+performed which can be useful to mock out physical transports
+
+|link:seda.html[SEDA] |Delivers messages asynchronously to consumers via
+a
+http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html[`java.util.concurrent.BlockingQueue`]
+which is good for testing asynchronous transports
+
+|link:stub.html[Stub] |Works like link:seda.html[SEDA] but does not
+validate the endpoint URI, which makes stubbing much easier.
+|=======================================================================
+
+[[Testing-Testingexistingroutes]]
+Testing existing routes
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Camel provides some features to aid during testing of existing routes
+where you cannot or will not use link:mock.html[Mock] etc. For example
+you may have a production ready route which you want to test with some
+3rd party API which sends messages into this route.
+
+[width="100%",cols="1,3",options="header",]
+|=======================================================================
+|Name |Description
+|link:notifybuilder.html[NotifyBuilder] |Allows you to be notified when
+a certain condition has occurred. For example when the route has
+completed 5 messages. You can build complex expressions to match your
+criteria when to be notified.
+
+|link:advicewith.html[AdviceWith] |Allows you to *advice* or *enhance*
+an existing route using a link:routebuilder.html[`RouteBuilder`] style.
+For example you can add interceptors to intercept sending outgoing
+messages to assert those messages are as expected.
+|=======================================================================