Author: davsclaus
Date: Wed May 11 09:06:03 2011
New Revision: 1101791

URL: http://svn.apache.org/viewvc?rev=1101791&view=rev
Log:
CAMEL-3960: camel-test with junit4 now supports per class setup/shutdown of 
CamelContext. This allows to re-use the context when having multiple test 
methods for faster unit testing.

Added:
    
camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterCreateCamelContextPerClassTest.java
      - copied, changed from r1101417, 
camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterJUnit4Test.java
Modified:
    
camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JaxbConverterTest.java
    
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/TestSupportNodeIdFactory.java
    
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/junit4/CamelTestSupport.java
    
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/junit4/TestSupport.java
    
camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterJUnit4Test.java
    camel/trunk/components/camel-test/src/test/resources/log4j.properties

Modified: 
camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JaxbConverterTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JaxbConverterTest.java?rev=1101791&r1=1101790&r2=1101791&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JaxbConverterTest.java
 (original)
+++ 
camel/trunk/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JaxbConverterTest.java
 Wed May 11 09:06:03 2011
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.converter.jaxb;
 
-import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.util.JAXBSource;
 import javax.xml.parsers.ParserConfigurationException;

Modified: 
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/TestSupportNodeIdFactory.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/TestSupportNodeIdFactory.java?rev=1101791&r1=1101790&r2=1101791&view=diff
==============================================================================
--- 
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/TestSupportNodeIdFactory.java
 (original)
+++ 
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/TestSupportNodeIdFactory.java
 Wed May 11 09:06:03 2011
@@ -19,8 +19,12 @@ package org.apache.camel.test;
 import org.apache.camel.impl.DefaultNodeIdFactory;
 
 public class TestSupportNodeIdFactory extends DefaultNodeIdFactory {
-    // start tests with fresh counters
+
+    /**
+     * Start tests with fresh counters
+     */
     public static void resetCounters() {
         resetAllCounters();
     }
+
 }

Modified: 
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/junit4/CamelTestSupport.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/junit4/CamelTestSupport.java?rev=1101791&r1=1101790&r2=1101791&view=diff
==============================================================================
--- 
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/junit4/CamelTestSupport.java
 (original)
+++ 
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/junit4/CamelTestSupport.java
 Wed May 11 09:06:03 2011
@@ -21,6 +21,7 @@ import java.util.Hashtable;
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 
@@ -46,7 +47,10 @@ import org.apache.camel.model.ProcessorD
 import org.apache.camel.spi.Language;
 import org.apache.camel.spring.CamelBeanPostProcessor;
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A useful base class which creates a {@link org.apache.camel.CamelContext} 
with some routes
@@ -56,24 +60,37 @@ import org.junit.Before;
  */
 public abstract class CamelTestSupport extends TestSupport {    
     
-    protected volatile CamelContext context;
-    protected volatile ProducerTemplate template;
-    protected volatile ConsumerTemplate consumer;
+    protected static volatile CamelContext context;
+    protected static volatile ProducerTemplate template;
+    protected static volatile ConsumerTemplate consumer;
+    protected static volatile Service camelContextService;
+    private static final Logger LOG = 
LoggerFactory.getLogger(TestSupport.class);
+    private static final AtomicBoolean INIT = new AtomicBoolean();
     private boolean useRouteBuilder = true;
-    private Service camelContextService;
     private final DebugBreakpoint breakpoint = new DebugBreakpoint();
 
     /**
      * Use the RouteBuilder or not
-     * @return 
-     *  If the return value is true, the camel context will be started in the 
setup method.
-     *  If the return value is false, the camel context will not be started in 
the setup method.
+     * @return <tt>true</tt> then {@link CamelContext} will be auto started,
+     *        <tt>false</tt> then {@link CamelContext} will <b>not</b> be auto 
started (you will have to start it manually)
      */
     public boolean isUseRouteBuilder() {
         return useRouteBuilder;
     }
 
     /**
+     * Override to control whether {@link CamelContext} should be setup per 
test or per class.
+     * <p/>
+     * By default it will be setup/teardown per test (per test method). If you 
want to re-use
+     * {@link CamelContext} between test methods you can override this method 
and return <tt>true</tt>
+     *
+     * @return <tt>true</tt> per class, <tt>false</tt> per test.
+     */
+    public boolean isCreateCamelContextPerClass() {
+        return false;
+    }
+
+    /**
      * Override to enable auto mocking endpoints based on the pattern.
      * <p/>
      * Return <tt>*</tt> to mock all endpoints.
@@ -97,8 +114,8 @@ public abstract class CamelTestSupport e
      * and stop the context; such as for Spring when the ApplicationContext is
      * started and stopped, rather than directly stopping the CamelContext
      */
-    public void setCamelContextService(Service camelContextService) {
-        this.camelContextService = camelContextService;
+    public void setCamelContextService(Service service) {
+        camelContextService = service;
     }
 
     @Before
@@ -107,6 +124,20 @@ public abstract class CamelTestSupport e
         log.info("Testing: " + getTestMethodName() + "(" + 
getClass().getName() + ")");
         
log.info("********************************************************************************");
 
+        boolean first = INIT.compareAndSet(false, true);
+        if (isCreateCamelContextPerClass()) {
+            if (first) {
+                doSetUp();
+            }
+            // must always post process to do IoC and reset mocks between tests
+            postProcessTest();
+            resetMocks();
+        } else {
+            doSetUp();
+        }
+    }
+
+    protected void doSetUp() throws Exception {
         log.debug("setUp test");
         if (!useJmx()) {
             disableJMX();
@@ -152,22 +183,34 @@ public abstract class CamelTestSupport e
         log.debug("Routing Rules are: " + context.getRoutes());
 
         assertValidContext(context);
+
+        INIT.set(true);
     }
 
     @After
     public void tearDown() throws Exception {
-        log.info("Testing done: " + this);
+        
log.info("********************************************************************************");
+        log.info("Testing done: " + getTestMethodName() + "(" + 
getClass().getName() + ")");
+        
log.info("********************************************************************************");
 
-        log.debug("tearDown test");
-        if (consumer != null) {
-            consumer.stop();
-        }
-        if (template != null) {
-            template.stop();
+        if (isCreateCamelContextPerClass()) {
+            // we tear down in after class
+            return;
         }
+
+        LOG.debug("tearDown test");
+        doStopTemplates();
         stopCamelContext();
     }
 
+    @AfterClass
+    public static void tearDownAfterClass() throws Exception {
+        INIT.set(false);
+        LOG.debug("tearDownAfterClass test");
+        doStopTemplates();
+        doStopCamelContext();
+    }
+
     /**
      * Returns the timeout to use when shutting down (unit in seconds).
      * <p/>
@@ -208,14 +251,31 @@ public abstract class CamelTestSupport e
         processor.setCamelContext(context);
         processor.postProcessBeforeInitialization(this, "this");
     }
-    
+
     protected void stopCamelContext() throws Exception {
+        doStopCamelContext();
+    }
+
+    private static void doStopCamelContext() throws Exception {
         if (camelContextService != null) {
             camelContextService.stop();
+            camelContextService = null;
         } else {
             if (context != null) {
                 context.stop();
-            }    
+                context = null;
+            }
+        }
+    }
+
+    private static void doStopTemplates() throws Exception {
+        if (consumer != null) {
+            consumer.stop();
+            consumer = null;
+        }
+        if (template != null) {
+            template.stop();
+            template = null;
         }
     }
 

Modified: 
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/junit4/TestSupport.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/junit4/TestSupport.java?rev=1101791&r1=1101790&r2=1101791&view=diff
==============================================================================
--- 
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/junit4/TestSupport.java
 (original)
+++ 
camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/junit4/TestSupport.java
 Wed May 11 09:06:03 2011
@@ -40,6 +40,8 @@ import org.apache.camel.processor.Delega
 import org.apache.camel.util.ExchangeHelper;
 import org.apache.camel.util.PredicateAssertHelper;
 import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.rules.TestName;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,9 +51,15 @@ import org.slf4j.LoggerFactory;
  * @version 
  */
 public abstract class TestSupport extends Assert {
-    private static final Logger LOG = 
LoggerFactory.getLogger(TestSupport.class);    
-    protected transient Logger log = LoggerFactory.getLogger(getClass());    
-    
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(TestSupport.class);
+    protected transient Logger log = LoggerFactory.getLogger(getClass());
+
+    // CHECKSTYLE:OFF
+    @Rule
+    public TestName testName = new TestName();
+    // CHECKSTYLE:ON
+
     // Builder methods for expressions used when testing
     // 
-------------------------------------------------------------------------
 
@@ -482,7 +490,9 @@ public abstract class TestSupport extend
      * Is this Java 1.5
      *
      * @return <tt>true</tt> if its Java 1.5, <tt>false</tt> if its not (for 
example Java 1.6 or better)
+     * @deprecated will be removed in the near future as Camel now requires 
JDK1.6+
      */
+    @Deprecated
     public static boolean isJava15() {
         String javaVersion = 
System.getProperty("java.version").toLowerCase(Locale.US);
         return javaVersion.startsWith("1.5");
@@ -494,9 +504,7 @@ public abstract class TestSupport extend
      * @return the method name
      */
     public String getTestMethodName() {
-        // TODO: When using latest junit we can use @Rule to remember the test 
name
-        // 
http://kentbeck.github.com/junit/javadoc/latest/org/junit/rules/TestName.html
-        return "";
+        return testName.getMethodName();
     }
 
 }

Copied: 
camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterCreateCamelContextPerClassTest.java
 (from r1101417, 
camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterJUnit4Test.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterCreateCamelContextPerClassTest.java?p2=camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterCreateCamelContextPerClassTest.java&p1=camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterJUnit4Test.java&r1=1101417&r2=1101791&rev=1101791&view=diff
==============================================================================
--- 
camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterJUnit4Test.java
 (original)
+++ 
camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterCreateCamelContextPerClassTest.java
 Wed May 11 09:06:03 2011
@@ -24,15 +24,13 @@ import org.apache.camel.component.mock.M
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
-// END SNIPPET: example
-
 /**
  * Tests filtering using Camel Test
  *
  * @version 
  */
 // START SNIPPET: example
-public class FilterJUnit4Test extends CamelTestSupport {
+public class FilterCreateCamelContextPerClassTest extends CamelTestSupport {
 
     @EndpointInject(uri = "mock:result")
     protected MockEndpoint resultEndpoint;
@@ -40,6 +38,14 @@ public class FilterJUnit4Test extends Ca
     @Produce(uri = "direct:start")
     protected ProducerTemplate template;
 
+    @Override
+    public boolean isCreateCamelContextPerClass() {
+        // we override this method and return true, to tell Camel test-kit that
+        // it should only create CamelContext once (per class), so we will
+        // re-use the CamelContext between each test method in this class
+        return true;
+    }
+
     @Test
     public void testSendMatchingMessage() throws Exception {
         String expectedBody = "<matched/>";

Modified: 
camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterJUnit4Test.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterJUnit4Test.java?rev=1101791&r1=1101790&r2=1101791&view=diff
==============================================================================
--- 
camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterJUnit4Test.java
 (original)
+++ 
camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterJUnit4Test.java
 Wed May 11 09:06:03 2011
@@ -24,8 +24,6 @@ import org.apache.camel.component.mock.M
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
-// END SNIPPET: example
-
 /**
  * Tests filtering using Camel Test
  *
@@ -68,4 +66,5 @@ public class FilterJUnit4Test extends Ca
             }
         };
     }
-}
\ No newline at end of file
+}
+// END SNIPPET: example

Modified: camel/trunk/components/camel-test/src/test/resources/log4j.properties
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-test/src/test/resources/log4j.properties?rev=1101791&r1=1101790&r2=1101791&view=diff
==============================================================================
--- camel/trunk/components/camel-test/src/test/resources/log4j.properties 
(original)
+++ camel/trunk/components/camel-test/src/test/resources/log4j.properties Wed 
May 11 09:06:03 2011
@@ -22,6 +22,7 @@ log4j.rootLogger=INFO, file
 
 log4j.logger.org.springframework=WARN
 #log4j.logger.org.apache.camel=DEBUG
+#log4j.logger.org.apache.camel.test.junit4=DEBUG
 
 # CONSOLE appender not used by default
 log4j.appender.out=org.apache.log4j.ConsoleAppender


Reply via email to