AnnotatedEmbedderUtils.java
package org.jbehave.core.junit;
import org.jbehave.core.embedder.EmbedderClassLoader;
import org.junit.runner.RunWith;
public class AnnotatedEmbedderUtils {
public static AnnotatedEmbedderRunner annotatedEmbedderRunner(String annotatedClassName,
EmbedderClassLoader classLoader) {
Class<?> runnerClass = runnerClass(annotatedClassName, classLoader);
return newAnnotatedEmbedderRunner(runnerClass, annotatedClassName, classLoader);
}
private static Class<?> runnerClass(String annotatedClassName, EmbedderClassLoader classLoader) {
Class<?> annotatedClass = loadClass(annotatedClassName, classLoader);
RunWith annotation = annotatedClass.getAnnotation(RunWith.class);
if (annotation != null) {
return annotation.value();
}
throw new MissingAnnotatedEmbedderRunner(annotatedClass);
}
private static AnnotatedEmbedderRunner newAnnotatedEmbedderRunner(Class<?> runnerClass, String annotatedClassName,
EmbedderClassLoader classLoader) {
try {
Class<?> annotatedClass = loadClass(annotatedClassName, classLoader);
return (AnnotatedEmbedderRunner) runnerClass.getConstructor(Class.class).newInstance(annotatedClass);
} catch (Exception e) {
throw new AnnotatedEmbedderRunnerInstantiationFailed(runnerClass, annotatedClassName, classLoader, e);
}
}
private static Class<?> loadClass(String className, EmbedderClassLoader classLoader) {
try {
return classLoader.loadClass(className);
} catch (ClassNotFoundException e) {
throw new ClassLoadingFailed(className, classLoader, e);
}
}
@SuppressWarnings("serial")
public static class ClassLoadingFailed extends RuntimeException {
public ClassLoadingFailed(String className, EmbedderClassLoader classLoader, Throwable cause) {
super("Failed to load class " + className + " with classLoader " + classLoader, cause);
}
}
@SuppressWarnings("serial")
public static class AnnotatedEmbedderRunnerInstantiationFailed extends RuntimeException {
public AnnotatedEmbedderRunnerInstantiationFailed(Class<?> runnerClass, String annotatedClassName,
EmbedderClassLoader classLoader, Throwable cause) {
super("Failed to instantiate annotated embedder runner " + runnerClass + " with annotatedClassName "
+ annotatedClassName + " and classLoader " + classLoader, cause);
}
}
@SuppressWarnings("serial")
public static class MissingAnnotatedEmbedderRunner extends RuntimeException {
public MissingAnnotatedEmbedderRunner(Class<?> annotatedClass) {
super("AnnotatedEmbedderRunner not specified via @RunWith annotation in annotatedClass " + annotatedClass);
}
}
}