package com.googlecode.zohhak.testutils;
import static org.junit.runner.Description.createTestDescription;
import org.junit.runner.Request;
import org.junit.runner.Result;
import org.junit.runner.Runner;
import org.junit.runner.notification.RunListener;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.model.InitializationError;
import org.mockito.Mockito;
import com.googlecode.zohhak.api.runners.ZohhakRunner;
public class JUnitLauncher {
private static final String ALL_METHODS = null;
public static Result runWithZohhak(Class<?> clazz) {
return runWithZohhak(clazz, ALL_METHODS);
}
public static Result runWithZohhak(Class<?> requestedClazz, String methodName) {
final Class<?> clazz = createClassWithPublicConstructor(requestedClazz);
final Request classRequest = createJUnitClassRequest(clazz);
final Request finalRequest = methodName != ALL_METHODS ?
classRequest.filterWith(createTestDescription(clazz, methodName))
: classRequest;
return runJUnitRequest(finalRequest);
}
public static Result runJUnitRequest(Request request) {
RunNotifier notifier = new RunNotifier();
Result result = new Result();
RunListener listener = result.createListener();
notifier.addListener(listener);
Runner runner = request.getRunner();
runner.run(notifier);
return result;
}
private static Request createJUnitClassRequest(Class<?> clazz) {
try {
return Request.runner(new ZohhakRunner(clazz));
} catch (InitializationError e) {
throw new RuntimeException(e);
}
}
/**
* creates copy of a class but with public constructor. it makes non-public
* classes with default constructor testable. useful for testing
*/
private static Class<?> createClassWithPublicConstructor(Class<?> clazz) {
return Mockito.mock(clazz).getClass();
}
}