/* | |
* Licensed to the Apache Software Foundation (ASF) under one or more | |
* contributor license agreements. See the NOTICE file distributed with | |
* this work for additional information regarding copyright ownership. | |
* The ASF licenses this file to you 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.myfaces.test.runners; | |
import org.junit.runner.notification.RunNotifier; | |
import org.junit.runners.BlockJUnit4ClassRunner; | |
import org.junit.runners.model.FrameworkMethod; | |
import org.junit.runners.model.InitializationError; | |
/** | |
* A Junit 4 runner that stores the name of the method that runs. The methods marked with @After and @Before | |
* (but also the Test method itself) can request this name for which it is running. | |
* | |
* @author Rudy De Busscher | |
*/ | |
public class NamedRunner extends BlockJUnit4ClassRunner | |
{ | |
/** The Constant PREFIX_KEY. */ | |
private static final String PREFIX_KEY = "ClassLoaderRunner_TestMethodName_"; | |
/** The Constant NO_NAME. */ | |
private static final String NO_NAME = "null"; | |
/** | |
* Instantiates a new named runner. | |
* | |
* @param klass the klass | |
* | |
* @throws InitializationError the initialization error | |
*/ | |
public NamedRunner(Class<?> klass) throws InitializationError | |
{ | |
super(klass); | |
} | |
@Override | |
protected void runChild(FrameworkMethod method, RunNotifier notifier) | |
{ | |
storeTestMethodName(method.getName()); | |
super.runChild(method, notifier); | |
removeTestMethodName(); | |
} | |
/** | |
* Gets the test method name. | |
* | |
* @return the test method name | |
*/ | |
public static String getTestMethodName() | |
{ | |
return retrieveTestMethodName(); | |
} | |
/** | |
* Retrieve test method name. | |
* | |
* @return the string | |
*/ | |
private static String retrieveTestMethodName() | |
{ | |
// We can't use a ThreadLocal variable in the case the TestPerClassLoader runner is used. Then this | |
// Method is accessed from another classloader and thus reinitialized variables. | |
String result = null; | |
String storedName = System.getProperty(getKey()); | |
if (!NO_NAME.equals(storedName)) | |
{ | |
result = storedName; | |
} | |
return result; | |
} | |
/** | |
* Removes the test method name. | |
*/ | |
private static void removeTestMethodName() | |
{ | |
// We can't use a ThreadLocal variable in the case the TestPerClassLoader runner is used. Then this | |
// Method is accessed from another classloader and thus reinitialized variables. | |
System.setProperty(getKey(), NO_NAME); | |
} | |
/** | |
* Store test method name. | |
* | |
* @param name the name | |
*/ | |
private static void storeTestMethodName(String name) | |
{ | |
// We can't use a ThreadLocal variable in the case the TestPerClassLoader runner is used. Then this | |
// Method is accessed from another classloader and thus reinitialized variables. | |
System.setProperty(getKey(), name); | |
} | |
/** | |
* Gets the key. | |
* | |
* @return the key | |
*/ | |
private static String getKey() | |
{ | |
StringBuffer buffer = new StringBuffer(); | |
buffer.append(PREFIX_KEY).append(Thread.currentThread().getName()); | |
return buffer.toString(); | |
} | |
} |