You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by uk...@apache.org on 2014/06/17 21:03:42 UTC

git commit: TAP5-2273 - Rename tapestry-ioc-test to tapestry-ioc-junit

Repository: tapestry-5
Updated Branches:
  refs/heads/master 4780b04b5 -> 04ea6d0e5


TAP5-2273 - Rename tapestry-ioc-test to tapestry-ioc-junit


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/04ea6d0e
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/04ea6d0e
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/04ea6d0e

Branch: refs/heads/master
Commit: 04ea6d0e531dace325d6d0e53763ebf52e454126
Parents: 4780b04
Author: uklance <uk...@gmail.com>
Authored: Tue Jun 17 20:01:37 2014 +0100
Committer: uklance <uk...@gmail.com>
Committed: Tue Jun 17 20:02:31 2014 +0100

----------------------------------------------------------------------
 settings.gradle                                 |   2 +-
 tapestry-ioc-junit/build.gradle                 |  10 ++
 .../apache/tapestry5/ioc/junit/ModuleDef.java   |  33 ++++
 .../apache/tapestry5/ioc/junit/Registry.java    |  41 +++++
 .../ioc/junit/RegistryShutdownType.java         |  30 ++++
 .../ioc/junit/TapestryIOCJUnit4ClassRunner.java | 152 ++++++++++++++++++
 .../ioc/junit/TestRegistryManager.java          | 131 ++++++++++++++++
 .../tapestry5/ioc/junit/MapModuleDef.java       | 116 ++++++++++++++
 ...estryIOCJUnit4ClassRunnerAfterClassTest.java |  63 ++++++++
 ...stryIOCJUnit4ClassRunnerAfterMethodTest.java |  65 ++++++++
 ...pestryIOCJUnit4ClassRunnerModuleDefTest.java |  69 +++++++++
 tapestry-ioc-test/build.gradle                  |  10 --
 .../apache/tapestry5/ioc/test/ModuleDef.java    |  33 ----
 .../org/apache/tapestry5/ioc/test/Registry.java |  41 -----
 .../ioc/test/RegistryShutdownType.java          |  30 ----
 .../ioc/test/TapestryIOCJUnit4ClassRunner.java  | 153 -------------------
 .../tapestry5/ioc/test/TestRegistryManager.java | 131 ----------------
 .../apache/tapestry5/ioc/test/MapModuleDef.java | 116 --------------
 ...estryIOCJUnit4ClassRunnerAfterClassTest.java |  61 --------
 ...stryIOCJUnit4ClassRunnerAfterMethodTest.java |  63 --------
 ...pestryIOCJUnit4ClassRunnerModuleDefTest.java |  66 --------
 21 files changed, 711 insertions(+), 705 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/settings.gradle
----------------------------------------------------------------------
diff --git a/settings.gradle b/settings.gradle
index 5f1ddf9..bf87d6f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -2,6 +2,6 @@ include "plastic", "tapestry5-annotations", "tapestry-test", "tapestry-func", "t
 include "tapestry-hibernate-core", "tapestry-hibernate", "tapestry-jmx", "tapestry-upload", "tapestry-spring"
 include "tapestry-beanvalidator", "tapestry-jpa", "tapestry-kaptcha"
 include "tapestry-javadoc", "quickstart", "tapestry-clojure", "tapestry-mongodb"
-include "tapestry-test-data", 'tapestry-internal-test', "tapestry-ioc-test"
+include "tapestry-test-data", 'tapestry-internal-test', "tapestry-ioc-junit"
 include "tapestry-webresources", "tapestry-runner", "tapestry-test-constants"
 // include "tapestry-cdi"

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-junit/build.gradle
----------------------------------------------------------------------
diff --git a/tapestry-ioc-junit/build.gradle b/tapestry-ioc-junit/build.gradle
new file mode 100644
index 0000000..6b2b625
--- /dev/null
+++ b/tapestry-ioc-junit/build.gradle
@@ -0,0 +1,10 @@
+description = "Utilities for junit testing a tapestry-ioc application"
+
+dependencies {
+    compile project(':tapestry-ioc')
+	compile 'junit:junit:4.11'
+}
+
+test {
+    useJUnit()
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/ModuleDef.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/ModuleDef.java b/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/ModuleDef.java
new file mode 100644
index 0000000..aa8a20e
--- /dev/null
+++ b/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/ModuleDef.java
@@ -0,0 +1,33 @@
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.junit;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Marker annotation for a method which creates a {@link org.apache.tapestry5.ioc.def.ModuleDef}.
+ * Used by the {@link TapestryIOCJUnit4ClassRunner}, methods with this annotation must be public, static, no-args methods
+ * which return {@link org.apache.tapestry5.ioc.def.ModuleDef} (or a subclass)
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@Inherited
+public @interface ModuleDef {
+
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/Registry.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/Registry.java b/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/Registry.java
new file mode 100644
index 0000000..55f3e1a
--- /dev/null
+++ b/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/Registry.java
@@ -0,0 +1,41 @@
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.junit;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Used by the {@link TapestryIOCJUnit4ClassRunner} to configure a test {@link org.apache.tapestry5.ioc.Registry}
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+public @interface Registry {
+	/**
+	 * Tapestry module classes
+	 * @return module class array
+	 */
+	Class<?>[] modules();
+	
+	/**
+	 * Determines the registry lifecycle
+	 * @return RegistryShutdownType
+	 */
+	RegistryShutdownType shutdown() default RegistryShutdownType.AFTER_CLASS;
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/RegistryShutdownType.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/RegistryShutdownType.java b/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/RegistryShutdownType.java
new file mode 100644
index 0000000..468dd86
--- /dev/null
+++ b/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/RegistryShutdownType.java
@@ -0,0 +1,30 @@
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.junit;
+
+/**
+ * Used in conjunction with the {@link TapestryIOCJUnit4ClassRunner} to determine the registry lifecycle
+ */
+public enum RegistryShutdownType {
+	/**
+	 * Test registry will be shut down once per test class
+	 */
+	AFTER_CLASS, 
+	
+	/**
+	 * Test registry will be shut down after each test method
+	 */
+	AFTER_METHOD;
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunner.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunner.java b/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunner.java
new file mode 100644
index 0000000..5b47317
--- /dev/null
+++ b/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunner.java
@@ -0,0 +1,152 @@
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.junit;
+
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.ioc.def.ModuleDef;
+import org.junit.runner.Description;
+import org.junit.runner.Result;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunListener;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runner.notification.StoppedByUserException;
+import org.junit.runners.BlockJUnit4ClassRunner;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.Statement;
+
+/**
+ * <p>
+ * A JUnit4ClassRunner to help with Tapestry IOC integration tests. The test
+ * runner requires a registry configuration to be defined in a {@link Registry}
+ * annotation. A {@link RegistryShutdownType} can be specified to configure the
+ * lifecycle of the test registry and it's services
+ * </p>
+ * 
+ * <p>
+ * {@link org.apache.tapestry5.ioc.junit.ModuleDef}s can be added to the
+ * {@link org.apache.tapestry5.ioc.Registry} by annotating a factory method(s)
+ * with {@link ModuleDef}. These {@link ModuleDef} factory methods must be
+ * <ul>
+ * <li>public</li>
+ * <li>static</li>
+ * <li>take zero arguments</li>
+ * <li>return a subclass of {@link org.apache.tapestry5.ioc.junit.ModuleDef}</li>
+ * </ul>
+ * </p>
+ * 
+ * <p>
+ * Any services defined in the registry can be {@link Inject}ed into the test
+ * class to be used during testing.
+ * </p>
+ */
+public class TapestryIOCJUnit4ClassRunner extends BlockJUnit4ClassRunner {
+	private final TestRegistryManager registryManager;
+
+	public TapestryIOCJUnit4ClassRunner(Class<?> type) throws InitializationError {
+		super(type);
+		this.registryManager = new TestRegistryManager(type);
+	}
+
+	@Override
+	public void run(RunNotifier notifier) {
+		RunNotifier wrapper = new RegistryManagerRunNotifier(registryManager, notifier);
+		super.run(wrapper);
+	}
+
+	@Override
+	protected Statement withAfterClasses(Statement statement) {
+		final Statement superStatement = super.withAfterClasses(statement);
+		return new Statement() {
+			@Override
+			public void evaluate() throws Throwable {
+				superStatement.evaluate();
+				registryManager.afterTestClass();
+			}
+		};
+	}
+
+	@Override
+	protected Object createTest() throws Exception {
+		org.apache.tapestry5.ioc.Registry registry = registryManager.getOrCreateRegistry();
+		return registry.autobuild(getTestClass().getJavaClass());
+	}
+
+	public static class RegistryManagerRunNotifier extends RunNotifier {
+		private final RunNotifier delegate;
+		private final TestRegistryManager registryManager;
+
+		public RegistryManagerRunNotifier(TestRegistryManager registryManager, RunNotifier delegate) {
+			super();
+			this.delegate = delegate;
+			this.registryManager = registryManager;
+		}
+		
+		@Override
+		public void addListener(RunListener listener) {
+			delegate.addListener(listener);
+		}
+
+		@Override
+		public void removeListener(RunListener listener) {
+			delegate.removeListener(listener);
+		}
+
+		@Override
+		public void fireTestRunStarted(Description description) {
+			delegate.fireTestRunStarted(description);
+		}
+
+		@Override
+		public void fireTestRunFinished(Result result) {
+			delegate.fireTestRunFinished(result);
+		}
+
+		@Override
+		public void fireTestStarted(Description description) throws StoppedByUserException {
+			delegate.fireTestStarted(description);
+		}
+
+		@Override
+		public void fireTestFailure(Failure failure) {
+			delegate.fireTestFailure(failure);
+		}
+
+		@Override
+		public void fireTestAssumptionFailed(Failure failure) {
+			delegate.fireTestAssumptionFailed(failure);
+		}
+
+		@Override
+		public void fireTestIgnored(Description description) {
+			delegate.fireTestIgnored(description);
+		}
+
+		@Override
+		public void fireTestFinished(Description description) {
+			registryManager.afterTestMethod();
+			delegate.fireTestFinished(description);
+		}
+
+		@Override
+		public void pleaseStop() {
+			delegate.pleaseStop();
+		}
+
+		@Override
+		public void addFirstListener(RunListener listener) {
+			delegate.addFirstListener(listener);
+		}
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/TestRegistryManager.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/TestRegistryManager.java b/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/TestRegistryManager.java
new file mode 100644
index 0000000..fd8ac45
--- /dev/null
+++ b/tapestry-ioc-junit/src/main/java/org/apache/tapestry5/ioc/junit/TestRegistryManager.java
@@ -0,0 +1,131 @@
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.junit;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.tapestry5.ioc.RegistryBuilder;
+import org.junit.runners.model.InitializationError;
+
+/**
+ * Helper class used by the {@link TapestryIOCJUnit4ClassRunner} to manage the test registry
+ */
+public class TestRegistryManager {
+	private final Registry annotation;
+	private final List<Method> moduleDefFactories;
+	
+	private org.apache.tapestry5.ioc.Registry registry;
+	
+	public TestRegistryManager(Class<?> type) throws InitializationError {
+		super();
+		
+		Registry annotation = type.getAnnotation(Registry.class);
+		if (annotation == null) {
+			throw new InitializationError(type.getName() + " does not specify a @Registry");
+		}
+		
+		this.annotation = annotation;
+		this.moduleDefFactories = findModuleDefFactories(type);
+	}
+	
+	protected List<Method> findModuleDefFactories(Class<?> type) throws InitializationError {
+		List<Method> factoryMethods = new ArrayList<Method>();
+		for (Method method : type.getMethods()) {
+			if (method.getAnnotation(ModuleDef.class) != null) {
+				validateModuleDefMethod(method);
+				factoryMethods.add(method);
+			}
+		}
+		return factoryMethods.isEmpty() ? Collections.<Method> emptyList() : factoryMethods;
+	}
+
+	protected void validateModuleDefMethod(Method method) throws InitializationError {
+		int modifiers = method.getModifiers();
+		if (method.getParameterTypes().length != 0
+				|| !Modifier.isStatic(modifiers)
+				|| !Modifier.isPublic(modifiers)) {
+
+			throw new InitializationError(
+					String.format("@ModuleDef method %s must be public static and accept no arguments",
+					method.getName()));
+		}
+		if (!org.apache.tapestry5.ioc.def.ModuleDef.class.isAssignableFrom(method.getReturnType())) {
+			throw new InitializationError(
+					String.format("@ModuleDef method %s return type %s is not valid",
+					method.getName(), method.getReturnType().getName()));
+		}
+	}
+
+	/**
+	 * Get the existing registry or create one if required.
+	 * @return The test Registry
+	 * @throws Exception
+	 */
+	public org.apache.tapestry5.ioc.Registry getOrCreateRegistry() throws Exception {
+		if (registry == null) {
+			RegistryBuilder builder = new RegistryBuilder();
+			if (annotation.modules() != null) {
+				builder.add(annotation.modules());
+			}
+			for (Method moduleDefFactory : moduleDefFactories) {
+				try {
+					org.apache.tapestry5.ioc.def.ModuleDef moduleDef =
+							(org.apache.tapestry5.ioc.def.ModuleDef) moduleDefFactory.invoke(null);
+					
+					builder.add(moduleDef);
+				} catch (InvocationTargetException e) {
+					if (e.getTargetException() instanceof Exception) {
+						throw (Exception) e.getTargetException();
+					}
+					throw e;
+				}
+			}
+			registry = builder.build();
+			registry.performRegistryStartup();
+		}
+		return registry;
+	}
+	
+	/**
+	 * Notify that the current test method has completed
+	 */
+	public void afterTestMethod() {
+		if (annotation.shutdown() == RegistryShutdownType.AFTER_METHOD) {
+			shutdownRegistry();
+		}
+	}
+
+	/**
+	 * Notify that the current test class has completed
+	 */
+	public void afterTestClass() {
+		if (annotation.shutdown() == RegistryShutdownType.AFTER_CLASS) {
+			shutdownRegistry();
+		}
+	}
+	
+	protected void shutdownRegistry() {
+		try {
+			registry.shutdown();
+		} finally {
+			registry = null;
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/MapModuleDef.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/MapModuleDef.java b/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/MapModuleDef.java
new file mode 100644
index 0000000..7f750dc
--- /dev/null
+++ b/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/MapModuleDef.java
@@ -0,0 +1,116 @@
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.junit;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.tapestry5.ioc.ObjectCreator;
+import org.apache.tapestry5.ioc.ScopeConstants;
+import org.apache.tapestry5.ioc.ServiceBuilderResources;
+import org.apache.tapestry5.ioc.def.ContributionDef;
+import org.apache.tapestry5.ioc.def.DecoratorDef;
+import org.apache.tapestry5.ioc.def.ModuleDef;
+import org.apache.tapestry5.ioc.def.ServiceDef;
+
+/**
+ * Test ModuleDef implementation based on a {@link Map}
+ */
+@SuppressWarnings("rawtypes")
+public class MapModuleDef implements ModuleDef {
+	private final Map<String, Object> map;
+
+	public MapModuleDef(Map<String, Object> map) {
+		super();
+		this.map = map;
+	}
+
+	@Override
+	public Class getBuilderClass() {
+		return null;
+	}
+
+	@Override
+	public Set<ContributionDef> getContributionDefs() {
+		return Collections.emptySet();
+	}
+
+	@Override
+	public Set<DecoratorDef> getDecoratorDefs() {
+		return Collections.emptySet();
+	}
+
+	@Override
+	public String getLoggerName() {
+		return "MapModuleDef";
+	}
+
+	@Override
+	public Set<String> getServiceIds() {
+		return map.keySet();
+	}
+
+	@Override
+	public ServiceDef getServiceDef(String serviceId) {
+		return new MapServiceDef(map, serviceId);
+	}
+
+	public static class MapServiceDef implements ServiceDef {
+		private final Map<String, Object> map;
+		private final String serviceId;
+
+		public MapServiceDef(Map<String, Object> map, String serviceId) {
+			super();
+			this.map = map;
+			this.serviceId = serviceId;
+		}
+
+		@Override
+		public ObjectCreator createServiceCreator(ServiceBuilderResources resources) {
+			return new ObjectCreator() {
+				@Override
+				public Object createObject() {
+					return map.get(serviceId);
+				}
+			};
+		}
+
+		@Override
+		public String getServiceId() {
+			return serviceId;
+		}
+
+		@Override
+		public Set<Class> getMarkers() {
+			return Collections.emptySet();
+		}
+
+		@Override
+		public Class getServiceInterface() {
+			return map.get(serviceId).getClass();
+		}
+
+		@Override
+		public String getServiceScope() {
+			return ScopeConstants.DEFAULT;
+		}
+
+		@Override
+		public boolean isEagerLoad() {
+			return false;
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerAfterClassTest.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerAfterClassTest.java b/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerAfterClassTest.java
new file mode 100644
index 0000000..67be2ef
--- /dev/null
+++ b/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerAfterClassTest.java
@@ -0,0 +1,63 @@
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.junit;
+
+import static org.apache.tapestry5.ioc.junit.RegistryShutdownType.AFTER_CLASS;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.runners.MethodSorters.NAME_ASCENDING;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.ioc.junit.Registry;
+import org.apache.tapestry5.ioc.junit.TapestryIOCJUnit4ClassRunner;
+import org.apache.tapestry5.ioc.junit.TapestryIOCJUnit4ClassRunnerAfterClassTest.AfterClassTestModule;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(TapestryIOCJUnit4ClassRunner.class)
+@Registry(modules=AfterClassTestModule.class, shutdown=AFTER_CLASS)
+@FixMethodOrder(NAME_ASCENDING) // guarantees test ordering
+public class TapestryIOCJUnit4ClassRunnerAfterClassTest {
+	public static class AfterClassTestModule {
+		public List<String> buildList() {
+			List<String> list = new ArrayList<String>();
+			list.add("foo");
+			return list;
+		}
+	}
+	
+	@Inject
+	private List<String> list;
+	
+	@Test
+	public void testInjectA() {
+		assertArrayEquals(new Object[] { "foo" }, list.toArray());
+		list.add("bar");
+	}
+
+	@Test
+	public void testInjectB() {
+		assertArrayEquals(new Object[] { "foo", "bar" }, list.toArray());
+		list.add("baz");
+	}
+
+	@Test
+	public void testInjectC() {
+		assertArrayEquals(new Object[] { "foo", "bar", "baz" }, list.toArray());
+	}
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerAfterMethodTest.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerAfterMethodTest.java b/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerAfterMethodTest.java
new file mode 100644
index 0000000..acbaa81
--- /dev/null
+++ b/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerAfterMethodTest.java
@@ -0,0 +1,65 @@
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.junit;
+
+import static org.apache.tapestry5.ioc.junit.RegistryShutdownType.AFTER_METHOD;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.runners.MethodSorters.NAME_ASCENDING;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.ioc.junit.Registry;
+import org.apache.tapestry5.ioc.junit.TapestryIOCJUnit4ClassRunner;
+import org.apache.tapestry5.ioc.junit.TapestryIOCJUnit4ClassRunnerAfterMethodTest.AfterMethodTestModule;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(TapestryIOCJUnit4ClassRunner.class)
+@Registry(modules=AfterMethodTestModule.class, shutdown=AFTER_METHOD)
+@FixMethodOrder(NAME_ASCENDING) // guarantees test ordering
+public class TapestryIOCJUnit4ClassRunnerAfterMethodTest {
+	public static class AfterMethodTestModule {
+		public List<String> buildList() {
+			List<String> list = new ArrayList<String>();
+			list.add("foo");
+			return list;
+		}
+	}
+	
+	@Inject
+	private List<String> list;
+	
+	@Test
+	public void testInjectA() {
+		assertArrayEquals(new Object[] { "foo" }, list.toArray());
+
+		list.add("bar");
+	}
+
+	@Test
+	public void testInjectB() {
+		assertArrayEquals(new Object[] { "foo" }, list.toArray());
+		
+		list.add("baz");
+	}
+
+	@Test
+	public void testInjectC() {
+		assertArrayEquals(new Object[] { "foo" }, list.toArray());
+	}
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerModuleDefTest.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerModuleDefTest.java b/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerModuleDefTest.java
new file mode 100644
index 0000000..3915584
--- /dev/null
+++ b/tapestry-ioc-junit/src/test/java/org/apache/tapestry5/ioc/junit/TapestryIOCJUnit4ClassRunnerModuleDefTest.java
@@ -0,0 +1,69 @@
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.ioc.junit;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.ioc.junit.ModuleDef;
+import org.apache.tapestry5.ioc.junit.Registry;
+import org.apache.tapestry5.ioc.junit.TapestryIOCJUnit4ClassRunner;
+import org.apache.tapestry5.ioc.junit.TapestryIOCJUnit4ClassRunnerModuleDefTest.ModuleDefTestModule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(TapestryIOCJUnit4ClassRunner.class)
+@Registry(modules=ModuleDefTestModule.class)
+public class TapestryIOCJUnit4ClassRunnerModuleDefTest {
+	@ModuleDef
+	public static MapModuleDef createModuleDef1() {
+		Map<String,Object> map = new HashMap<String, Object>();
+		map.put("a", new Date(111));
+		map.put("b", 222L);
+		
+		return new MapModuleDef(map);
+	}
+
+	@ModuleDef
+	public static org.apache.tapestry5.ioc.def.ModuleDef createModuleDef2() {
+		Map<String,Object> map = new HashMap<String, Object>();
+		map.put("c", 333);
+
+		return new MapModuleDef(map);
+	}
+
+	public static class ModuleDefTestModule {
+		public String buildD() {
+			return "444";
+		}
+	}
+
+	@Inject private Date a;
+	@Inject private Long b;
+	@Inject private Integer c;
+	@Inject private String d;
+	
+	@Test
+	public void testModuleDefInject() {
+		assertEquals(new Date(111), a);
+		assertEquals(new Long(222L), b);
+		assertEquals(new Integer(333), c);
+		assertEquals("444", d);
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-test/build.gradle
----------------------------------------------------------------------
diff --git a/tapestry-ioc-test/build.gradle b/tapestry-ioc-test/build.gradle
deleted file mode 100644
index 36261dc..0000000
--- a/tapestry-ioc-test/build.gradle
+++ /dev/null
@@ -1,10 +0,0 @@
-description = "Utilities for integration testing a tapestry-ioc app"
-
-dependencies {
-    compile project(':tapestry-ioc')
-	compile 'junit:junit:4.11'
-}
-
-test {
-    useJUnit()
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/ModuleDef.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/ModuleDef.java b/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/ModuleDef.java
deleted file mode 100644
index 529bad6..0000000
--- a/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/ModuleDef.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package org.apache.tapestry5.ioc.test;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Marker annotation for a method which creates a {@link org.apache.tapestry5.ioc.def.ModuleDef}.
- * Used by the {@link TapestryIOCJUnit4ClassRunner}, methods with this annotation must be public, static, no-args methods
- * which return {@link ModuleDef} (or a subclass)
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-@Inherited
-public @interface ModuleDef {
-
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/Registry.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/Registry.java b/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/Registry.java
deleted file mode 100644
index e11c995..0000000
--- a/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/Registry.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package org.apache.tapestry5.ioc.test;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Used by the {@link TapestryIOCJUnit4ClassRunner} to configure a test {@link org.apache.tapestry5.ioc.Registry}
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-@Inherited
-public @interface Registry {
-	/**
-	 * Tapestry module classes
-	 * @return module class array
-	 */
-	Class<?>[] modules();
-	
-	/**
-	 * Determines the registry lifecycle
-	 * @return RegistryShutdownType
-	 */
-	RegistryShutdownType shutdown() default RegistryShutdownType.AFTER_CLASS;
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/RegistryShutdownType.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/RegistryShutdownType.java b/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/RegistryShutdownType.java
deleted file mode 100644
index a457043..0000000
--- a/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/RegistryShutdownType.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package org.apache.tapestry5.ioc.test;
-
-/**
- * @see TapestryIOCJUnit4ClassRunner
- */
-public enum RegistryShutdownType {
-	/**
-	 * Test registry will be shut down once per test class
-	 */
-	AFTER_CLASS, 
-	
-	/**
-	 * Test registry will be shut down after each test method
-	 */
-	AFTER_METHOD;
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunner.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunner.java b/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunner.java
deleted file mode 100644
index 54d33af..0000000
--- a/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunner.java
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package org.apache.tapestry5.ioc.test;
-
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.ioc.def.ModuleDef;
-import org.junit.runner.Description;
-import org.junit.runner.Result;
-import org.junit.runner.notification.Failure;
-import org.junit.runner.notification.RunListener;
-import org.junit.runner.notification.RunNotifier;
-import org.junit.runner.notification.StoppedByUserException;
-import org.junit.runners.BlockJUnit4ClassRunner;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.Statement;
-
-/**
- * <p>
- * A JUnit4ClassRunner to help with Tapestry IOC integration tests. The test
- * runner requires a registry configuration to be defined in a {@link Registry}
- * annotation. A {@link RegistryShutdownType} can be specified to configure the
- * lifecycle of the test registry and it's services
- * </p>
- * 
- * <p>
- * {@link ModuleDef}s can be added to the
- * {@link org.apache.tapestry5.ioc.Registry} by annotating a factory method(s)
- * with {@link org.apache.tapestry5.ioc.test.ModuleDef}. These {@link ModuleDef}
- * factory methods must be
- * <ul>
- * <li>public</li>
- * <li>static</li>
- * <li>take zero arguments</li>
- * <li>return a subclass of {@link ModuleDef}</li>
- * </ul>
- * </p>
- * 
- * <p>
- * Any services defined in the registry can be {@link Inject}ed into the test
- * class to be used during testing.
- * </p>
- */
-public class TapestryIOCJUnit4ClassRunner extends BlockJUnit4ClassRunner {
-	private final TestRegistryManager registryManager;
-
-	public TapestryIOCJUnit4ClassRunner(Class<?> type) throws InitializationError {
-		super(type);
-		this.registryManager = new TestRegistryManager(type);
-	}
-
-	@Override
-	public void run(RunNotifier notifier) {
-		RunNotifier wrapper = new RegistryManagerRunNotifier(registryManager, notifier);
-		super.run(wrapper);
-	}
-
-	@Override
-	protected Statement withAfterClasses(Statement statement) {
-		final Statement superStatement = super.withAfterClasses(statement);
-		return new Statement() {
-			@Override
-			public void evaluate() throws Throwable {
-				superStatement.evaluate();
-				registryManager.afterTestClass();
-			}
-		};
-	}
-
-	@Override
-	protected Object createTest() throws Exception {
-		org.apache.tapestry5.ioc.Registry registry = registryManager.getOrCreateRegistry();
-		return registry.autobuild(getTestClass().getJavaClass());
-	}
-
-	public static class RegistryManagerRunNotifier extends RunNotifier {
-		private final RunNotifier delegate;
-		private final TestRegistryManager registryManager;
-
-		public RegistryManagerRunNotifier(TestRegistryManager registryManager, RunNotifier delegate) {
-			super();
-			this.delegate = delegate;
-			this.registryManager = registryManager;
-		}
-		
-		@Override
-		public void addListener(RunListener listener) {
-			delegate.addListener(listener);
-		}
-
-		@Override
-		public void removeListener(RunListener listener) {
-			delegate.removeListener(listener);
-		}
-
-		@Override
-		public void fireTestRunStarted(Description description) {
-			delegate.fireTestRunStarted(description);
-		}
-
-		@Override
-		public void fireTestRunFinished(Result result) {
-			delegate.fireTestRunFinished(result);
-		}
-
-		@Override
-		public void fireTestStarted(Description description) throws StoppedByUserException {
-			delegate.fireTestStarted(description);
-		}
-
-		@Override
-		public void fireTestFailure(Failure failure) {
-			delegate.fireTestFailure(failure);
-		}
-
-		@Override
-		public void fireTestAssumptionFailed(Failure failure) {
-			delegate.fireTestAssumptionFailed(failure);
-		}
-
-		@Override
-		public void fireTestIgnored(Description description) {
-			delegate.fireTestIgnored(description);
-		}
-
-		@Override
-		public void fireTestFinished(Description description) {
-			registryManager.afterTestMethod();
-			delegate.fireTestFinished(description);
-		}
-
-		@Override
-		public void pleaseStop() {
-			delegate.pleaseStop();
-		}
-
-		@Override
-		public void addFirstListener(RunListener listener) {
-			delegate.addFirstListener(listener);
-		}
-	}
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/TestRegistryManager.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/TestRegistryManager.java b/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/TestRegistryManager.java
deleted file mode 100644
index a5e0145..0000000
--- a/tapestry-ioc-test/src/main/java/org/apache/tapestry5/ioc/test/TestRegistryManager.java
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package org.apache.tapestry5.ioc.test;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.tapestry5.ioc.RegistryBuilder;
-import org.junit.runners.model.InitializationError;
-
-/**
- * Helper class used by the {@link TapestryIOCJUnit4ClassRunner} to manage the test registry
- */
-public class TestRegistryManager {
-	private final Registry annotation;
-	private final List<Method> moduleDefFactories;
-	
-	private org.apache.tapestry5.ioc.Registry registry;
-	
-	public TestRegistryManager(Class<?> type) throws InitializationError {
-		super();
-		
-		Registry annotation = type.getAnnotation(Registry.class);
-		if (annotation == null) {
-			throw new InitializationError(type.getName() + " does not specify a @Registry");
-		}
-		
-		this.annotation = annotation;
-		this.moduleDefFactories = findModuleDefFactories(type);
-	}
-	
-	protected List<Method> findModuleDefFactories(Class<?> type) throws InitializationError {
-		List<Method> factoryMethods = new ArrayList<Method>();
-		for (Method method : type.getMethods()) {
-			if (method.getAnnotation(ModuleDef.class) != null) {
-				validateModuleDefMethod(method);
-				factoryMethods.add(method);
-			}
-		}
-		return factoryMethods.isEmpty() ? Collections.<Method> emptyList() : factoryMethods;
-	}
-
-	protected void validateModuleDefMethod(Method method) throws InitializationError {
-		int modifiers = method.getModifiers();
-		if (method.getParameterTypes().length != 0
-				|| !Modifier.isStatic(modifiers)
-				|| !Modifier.isPublic(modifiers)) {
-
-			throw new InitializationError(
-					String.format("@ModuleDef method %s must be public static and accept no arguments",
-					method.getName()));
-		}
-		if (!org.apache.tapestry5.ioc.def.ModuleDef.class.isAssignableFrom(method.getReturnType())) {
-			throw new InitializationError(
-					String.format("@ModuleDef method %s return type %s is not valid",
-					method.getName(), method.getReturnType().getName()));
-		}
-	}
-
-	/**
-	 * Get the existing registry or create one if required.
-	 * @return The test Registry
-	 * @throws Exception
-	 */
-	public org.apache.tapestry5.ioc.Registry getOrCreateRegistry() throws Exception {
-		if (registry == null) {
-			RegistryBuilder builder = new RegistryBuilder();
-			if (annotation.modules() != null) {
-				builder.add(annotation.modules());
-			}
-			for (Method moduleDefFactory : moduleDefFactories) {
-				try {
-					org.apache.tapestry5.ioc.def.ModuleDef moduleDef =
-							(org.apache.tapestry5.ioc.def.ModuleDef) moduleDefFactory.invoke(null);
-					
-					builder.add(moduleDef);
-				} catch (InvocationTargetException e) {
-					if (e.getTargetException() instanceof Exception) {
-						throw (Exception) e.getTargetException();
-					}
-					throw e;
-				}
-			}
-			registry = builder.build();
-			registry.performRegistryStartup();
-		}
-		return registry;
-	}
-	
-	/**
-	 * Notify that the current test method has completed
-	 */
-	public void afterTestMethod() {
-		if (annotation.shutdown() == RegistryShutdownType.AFTER_METHOD) {
-			shutdownRegistry();
-		}
-	}
-
-	/**
-	 * Notify that the current test class has completed
-	 */
-	public void afterTestClass() {
-		if (annotation.shutdown() == RegistryShutdownType.AFTER_CLASS) {
-			shutdownRegistry();
-		}
-	}
-	
-	protected void shutdownRegistry() {
-		try {
-			registry.shutdown();
-		} finally {
-			registry = null;
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/MapModuleDef.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/MapModuleDef.java b/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/MapModuleDef.java
deleted file mode 100644
index 6001b2c..0000000
--- a/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/MapModuleDef.java
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package org.apache.tapestry5.ioc.test;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tapestry5.ioc.ObjectCreator;
-import org.apache.tapestry5.ioc.ScopeConstants;
-import org.apache.tapestry5.ioc.ServiceBuilderResources;
-import org.apache.tapestry5.ioc.def.ContributionDef;
-import org.apache.tapestry5.ioc.def.DecoratorDef;
-import org.apache.tapestry5.ioc.def.ModuleDef;
-import org.apache.tapestry5.ioc.def.ServiceDef;
-
-/**
- * Test ModuleDef implementation based on a {@link Map}
- */
-@SuppressWarnings("rawtypes")
-public class MapModuleDef implements ModuleDef {
-	private final Map<String, Object> map;
-
-	public MapModuleDef(Map<String, Object> map) {
-		super();
-		this.map = map;
-	}
-
-	@Override
-	public Class getBuilderClass() {
-		return null;
-	}
-
-	@Override
-	public Set<ContributionDef> getContributionDefs() {
-		return Collections.emptySet();
-	}
-
-	@Override
-	public Set<DecoratorDef> getDecoratorDefs() {
-		return Collections.emptySet();
-	}
-
-	@Override
-	public String getLoggerName() {
-		return "MapModuleDef";
-	}
-
-	@Override
-	public Set<String> getServiceIds() {
-		return map.keySet();
-	}
-
-	@Override
-	public ServiceDef getServiceDef(String serviceId) {
-		return new MapServiceDef(map, serviceId);
-	}
-
-	public static class MapServiceDef implements ServiceDef {
-		private final Map<String, Object> map;
-		private final String serviceId;
-
-		public MapServiceDef(Map<String, Object> map, String serviceId) {
-			super();
-			this.map = map;
-			this.serviceId = serviceId;
-		}
-
-		@Override
-		public ObjectCreator createServiceCreator(ServiceBuilderResources resources) {
-			return new ObjectCreator() {
-				@Override
-				public Object createObject() {
-					return map.get(serviceId);
-				}
-			};
-		}
-
-		@Override
-		public String getServiceId() {
-			return serviceId;
-		}
-
-		@Override
-		public Set<Class> getMarkers() {
-			return Collections.emptySet();
-		}
-
-		@Override
-		public Class getServiceInterface() {
-			return map.get(serviceId).getClass();
-		}
-
-		@Override
-		public String getServiceScope() {
-			return ScopeConstants.DEFAULT;
-		}
-
-		@Override
-		public boolean isEagerLoad() {
-			return false;
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerAfterClassTest.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerAfterClassTest.java b/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerAfterClassTest.java
deleted file mode 100644
index 354f491..0000000
--- a/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerAfterClassTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package org.apache.tapestry5.ioc.test;
-
-import static org.apache.tapestry5.ioc.test.RegistryShutdownType.AFTER_CLASS;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.runners.MethodSorters.NAME_ASCENDING;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.ioc.test.TapestryIOCJUnit4ClassRunnerAfterClassTest.AfterClassTestModule;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(TapestryIOCJUnit4ClassRunner.class)
-@Registry(modules=AfterClassTestModule.class, shutdown=AFTER_CLASS)
-@FixMethodOrder(NAME_ASCENDING) // guarantees test ordering
-public class TapestryIOCJUnit4ClassRunnerAfterClassTest {
-	public static class AfterClassTestModule {
-		public List<String> buildList() {
-			List<String> list = new ArrayList<String>();
-			list.add("foo");
-			return list;
-		}
-	}
-	
-	@Inject
-	private List<String> list;
-	
-	@Test
-	public void testInjectA() {
-		assertArrayEquals(new Object[] { "foo" }, list.toArray());
-		list.add("bar");
-	}
-
-	@Test
-	public void testInjectB() {
-		assertArrayEquals(new Object[] { "foo", "bar" }, list.toArray());
-		list.add("baz");
-	}
-
-	@Test
-	public void testInjectC() {
-		assertArrayEquals(new Object[] { "foo", "bar", "baz" }, list.toArray());
-	}
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerAfterMethodTest.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerAfterMethodTest.java b/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerAfterMethodTest.java
deleted file mode 100644
index cc51c0b..0000000
--- a/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerAfterMethodTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package org.apache.tapestry5.ioc.test;
-
-import static org.apache.tapestry5.ioc.test.RegistryShutdownType.AFTER_METHOD;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.runners.MethodSorters.NAME_ASCENDING;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.ioc.test.TapestryIOCJUnit4ClassRunnerAfterMethodTest.AfterMethodTestModule;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(TapestryIOCJUnit4ClassRunner.class)
-@Registry(modules=AfterMethodTestModule.class, shutdown=AFTER_METHOD)
-@FixMethodOrder(NAME_ASCENDING) // guarantees test ordering
-public class TapestryIOCJUnit4ClassRunnerAfterMethodTest {
-	public static class AfterMethodTestModule {
-		public List<String> buildList() {
-			List<String> list = new ArrayList<String>();
-			list.add("foo");
-			return list;
-		}
-	}
-	
-	@Inject
-	private List<String> list;
-	
-	@Test
-	public void testInjectA() {
-		assertArrayEquals(new Object[] { "foo" }, list.toArray());
-
-		list.add("bar");
-	}
-
-	@Test
-	public void testInjectB() {
-		assertArrayEquals(new Object[] { "foo" }, list.toArray());
-		
-		list.add("baz");
-	}
-
-	@Test
-	public void testInjectC() {
-		assertArrayEquals(new Object[] { "foo" }, list.toArray());
-	}
-}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/04ea6d0e/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerModuleDefTest.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerModuleDefTest.java b/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerModuleDefTest.java
deleted file mode 100644
index 6426648..0000000
--- a/tapestry-ioc-test/src/test/java/org/apache/tapestry5/ioc/test/TapestryIOCJUnit4ClassRunnerModuleDefTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 The Apache Software Foundation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package org.apache.tapestry5.ioc.test;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.ioc.test.TapestryIOCJUnit4ClassRunnerModuleDefTest.ModuleDefTestModule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(TapestryIOCJUnit4ClassRunner.class)
-@Registry(modules=ModuleDefTestModule.class)
-public class TapestryIOCJUnit4ClassRunnerModuleDefTest {
-	@ModuleDef
-	public static MapModuleDef createModuleDef1() {
-		Map<String,Object> map = new HashMap<String, Object>();
-		map.put("a", new Date(111));
-		map.put("b", 222L);
-		
-		return new MapModuleDef(map);
-	}
-
-	@ModuleDef
-	public static org.apache.tapestry5.ioc.def.ModuleDef createModuleDef2() {
-		Map<String,Object> map = new HashMap<String, Object>();
-		map.put("c", 333);
-
-		return new MapModuleDef(map);
-	}
-
-	public static class ModuleDefTestModule {
-		public String buildD() {
-			return "444";
-		}
-	}
-
-	@Inject private Date a;
-	@Inject private Long b;
-	@Inject private Integer c;
-	@Inject private String d;
-	
-	@Test
-	public void testModuleDefInject() {
-		assertEquals(new Date(111), a);
-		assertEquals(new Long(222L), b);
-		assertEquals(new Integer(333), c);
-		assertEquals("444", d);
-	}
-}
\ No newline at end of file