/* | |
* 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 | |
* @since 1.0.0 | |
*/ | |
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(); | |
} | |
} |