blob: d12741978bbf80f5fcb2babcbc7d7137acce8700 [file] [log] [blame]
// 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);
}
}
}