Junit provides a series of junit 4 runners in the core package, for instance: org.junit.runner, JUnitCore, JUnit38ClassRunner, JUnit4ClassRunner, Parameterized
and etc. these Junit runners are used to centralize and execute your test cases, JUnit4 is the default one If no customized runner annotated, our needs is to implement a customized Junit runner, in this how-to, we guide how do I write a custom Junit runner to run test cases.
1. Implement your Junit runner.
To implement a customized runner, you need to extend junit 4 abstract class Runner
. and overwrite methods getDescription
and run(RunNotifier runNotifier)
, the parameter RunNotifier
is a instance of class which controls a set of test methods.
import org.junit.Ignore;
import org.junit.Test;
import org.junit.internal.runners.TestClass;
import org.junit.runner.Description;
import org.junit.runner.Runner;
import org.junit.runner.notification.RunNotifier;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
/**
* User: asjava.com
* Date: Sep 18, 2010
* Time: 1:30:43 AM
*/
public class CustomTestRunner extends Runner {
private List fTestMethods = new ArrayList();
private final TestClass fTestClass;
public CustomTestRunner(java.lang.Class aClass) {
fTestClass = new TestClass(aClass);
Method[] classMethods = aClass.getDeclaredMethods();
for (int i = 0; i < classMethods.length; i++) {
Method classMethod = classMethods[i];
Class retClass = classMethod.getReturnType();
int length = classMethod.getParameterTypes().length;
int modifiers = classMethod.getModifiers();
if (retClass == null || length != 0 || Modifier.isStatic(modifiers)
|| !Modifier.isPublic(modifiers) || Modifier.isInterface(modifiers)
|| Modifier.isAbstract(modifiers)) {
continue;
}
String methodName = classMethod.getName();
if (methodName.toUpperCase().startsWith("TEST")
|| classMethod.getAnnotation(Test.class) != null) {
fTestMethods.add(classMethod);
}
if (classMethod.getAnnotation(Ignore.class) != null) {
fTestMethods.remove(classMethod);
}
}
}
@Override
public Description getDescription() {
Description spec = Description.createSuiteDescription(this.fTestClass.getName(),
this.fTestClass.getJavaClass().getAnnotations());
return spec;
}
@Override
public void run(RunNotifier runNotifier) {
for (int i = 0; i < fTestMethods.size(); i++) {
Method method = fTestMethods.get(i);
Description spec = Description.createTestDescription(method.getClass(), method.getName());
runNotifier.fireTestStarted(spec);
}
}
}
2. Write test case and annotate it to use the customized Junit runner.
The annotation RunWith
allows specifying a customized runner for these test cases, just simply annotate @RunWith
in class definition.
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(value=CustomTestRunner.class)
public class JunitExample extends Assert {
@Test
public void testMethod() {
int a = 10;
assertEquals(a, 10);
}
}
use a command line tool to run these tests as below example, the first one is a Junit runner, the second one is the test class.
java CustomTestRunner JunitExample