Author: davsclaus
Date: Thu May 12 08:17:09 2011
New Revision: 1102199
URL: http://svn.apache.org/viewvc?rev=1102199&view=rev
Log:
CAMEL-3960: camel-testng now also supports create camel context per class. And
aligned the code from camel-test to camel-testng.
Added:
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterCreateCamelContextPerClassTest.java
- copied, changed from r1102162,
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterTestNGTest.java
Modified:
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/CamelTestSupport.java
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/TestSupport.java
camel/trunk/components/camel-testng/src/test/resources/log4j.properties
Modified:
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/CamelTestSupport.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/CamelTestSupport.java?rev=1102199&r1=1102198&r2=1102199&view=diff
==============================================================================
---
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/CamelTestSupport.java
(original)
+++
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/CamelTestSupport.java
Thu May 12 08:17:09 2011
@@ -21,7 +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;
@@ -40,13 +40,19 @@ import org.apache.camel.component.mock.M
import org.apache.camel.impl.BreakpointSupport;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.DefaultDebugger;
+import org.apache.camel.impl.InterceptSendToMockEndpointStrategy;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.management.JmxSystemPropertyKeys;
import org.apache.camel.model.ProcessorDefinition;
import org.apache.camel.spi.Language;
import org.apache.camel.spring.CamelBeanPostProcessor;
+import org.junit.AfterClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
/**
* A useful base class which creates a {@link org.apache.camel.CamelContext}
with some routes
@@ -56,13 +62,20 @@ import org.testng.annotations.BeforeMeth
*/
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 <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;
}
@@ -71,6 +84,32 @@ public abstract class CamelTestSupport e
this.useRouteBuilder = 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>
+ * <p/>
+ * <b>Important:</b> Use this with care as the {@link CamelContext} will
carry over state
+ * from previous tests, such as endpoints, components etc. So you cannot
use this in all your tests.
+ *
+ * @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.
+ *
+ * @see org.apache.camel.util.EndpointHelper#matchEndpoint(String, String)
+ */
+ public String isMockEndpoints() {
+ return null;
+ }
+
public Service getCamelContextService() {
return camelContextService;
}
@@ -80,12 +119,33 @@ 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;
}
@BeforeMethod
public void setUp() throws Exception {
+
log.info("********************************************************************************");
+ log.info("Testing: " + getTestMethodName() + "(" +
getClass().getName() + ")");
+
log.info("********************************************************************************");
+
+ boolean first = INIT.compareAndSet(false, true);
+ if (isCreateCamelContextPerClass()) {
+ // test is per class, so only setup once (the first time)
+ if (first) {
+ doSetUp();
+ } else {
+ // and in between tests we must do IoC and reset mocks
+ postProcessTest();
+ resetMocks();
+ }
+ } else {
+ // test is per test so always setup
+ doSetUp();
+ }
+ }
+
+ protected void doSetUp() throws Exception {
log.debug("setUp test");
if (!useJmx()) {
disableJMX();
@@ -109,6 +169,12 @@ public abstract class CamelTestSupport e
consumer = context.createConsumerTemplate();
consumer.start();
+ // enable auto mocking if enabled
+ String pattern = isMockEndpoints();
+ if (pattern != null) {
+ context.addRegisterEndpointCallback(new
InterceptSendToMockEndpointStrategy(pattern));
+ }
+
postProcessTest();
if (isUseRouteBuilder()) {
@@ -117,30 +183,45 @@ public abstract class CamelTestSupport e
log.debug("Using created route builder: " + builder);
context.addRoutes(builder);
}
- startCamelContext();
- log.debug("Routing Rules are: " + context.getRoutes());
+ if
(!"true".equalsIgnoreCase(System.getProperty("skipStartingCamelContext"))) {
+ startCamelContext();
+ } else {
+ log.info("Skipping starting CamelContext as system property
skipStartingCamelContext is set to be true.");
+ }
} else {
log.debug("Using route builder from the created context: " +
context);
}
log.debug("Routing Rules are: " + context.getRoutes());
assertValidContext(context);
+
+ INIT.set(true);
}
@AfterMethod
public void tearDown() throws Exception {
- log.info("Testing done: " + this);
+
log.info("********************************************************************************");
+ log.info("Testing done: " + getTestMethodName() + "(" +
getClass().getName() + ")");
+
log.info("********************************************************************************");
+
+ if (isCreateCamelContextPerClass()) {
+ // we tear down in after class
+ return;
+ }
log.debug("tearDown test");
- if (consumer != null) {
- consumer.stop();
- }
- if (template != null) {
- template.stop();
- }
+ 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/>
@@ -169,7 +250,7 @@ public abstract class CamelTestSupport e
* @return <tt>true</tt> by default.
*/
protected boolean isLazyLoadingTypeConverter() {
- return false;
+ return true;
}
/**
@@ -183,15 +264,32 @@ public abstract class CamelTestSupport e
}
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;
+ }
+ }
+
protected void startCamelContext() throws Exception {
if (camelContextService != null) {
camelContextService.start();
Modified:
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/TestSupport.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/TestSupport.java?rev=1102199&r1=1102198&r2=1102199&view=diff
==============================================================================
---
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/TestSupport.java
(original)
+++
camel/trunk/components/camel-testng/src/main/java/org/apache/camel/testng/TestSupport.java
Thu May 12 08:17:09 2011
@@ -480,10 +480,16 @@ 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");
}
+ public String getTestMethodName() {
+ return "";
+ }
+
}
Copied:
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterCreateCamelContextPerClassTest.java
(from r1102162,
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterTestNGTest.java)
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterCreateCamelContextPerClassTest.java?p2=camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterCreateCamelContextPerClassTest.java&p1=camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterTestNGTest.java&r1=1102162&r2=1102199&rev=1102199&view=diff
==============================================================================
---
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterTestNGTest.java
(original)
+++
camel/trunk/components/camel-testng/src/test/java/org/apache/camel/testng/patterns/FilterCreateCamelContextPerClassTest.java
Thu May 12 08:17:09 2011
@@ -29,7 +29,7 @@ import org.testng.annotations.Test;
*
* @version $Revision$
*/
-public class FilterTestNGTest extends CamelTestSupport {
+public class FilterCreateCamelContextPerClassTest extends CamelTestSupport {
@EndpointInject(uri = "mock:result")
protected MockEndpoint resultEndpoint;
@@ -37,6 +37,14 @@ public class FilterTestNGTest 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 false;
+ }
+
@Test
public void testSendMatchingMessage() throws Exception {
String expectedBody = "<matched/>";
Modified:
camel/trunk/components/camel-testng/src/test/resources/log4j.properties
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-testng/src/test/resources/log4j.properties?rev=1102199&r1=1102198&r2=1102199&view=diff
==============================================================================
--- camel/trunk/components/camel-testng/src/test/resources/log4j.properties
(original)
+++ camel/trunk/components/camel-testng/src/test/resources/log4j.properties Thu
May 12 08:17:09 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.testng=DEBUG
# CONSOLE appender not used by default
log4j.appender.out=org.apache.log4j.ConsoleAppender