| // 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; |
| |
| /** |
| * |
| * 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 |
| * |
| * |
| * |
| * {@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> |
| * |
| * |
| * |
| * Any services defined in the registry can be {@link Inject}ed into the test |
| * class to be used during testing. |
| * |
| */ |
| 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); |
| } |
| } |
| } |