Make it consistent with the test-mock and test-runner directories. Also renames the files in api/ subdirectory. Bug: 30188076 Test: make checkbuild Change-Id: If4f99a65fcca416ede5b3e63481398f0b451bcb7
213 lines
5.5 KiB
Java
213 lines
5.5 KiB
Java
package junit.framework;
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.lang.reflect.Method;
|
|
import java.lang.reflect.Modifier;
|
|
|
|
/**
|
|
* A test case defines the fixture to run multiple tests. To define a test case<br/>
|
|
* <ol>
|
|
* <li>implement a subclass of <code>TestCase</code></li>
|
|
* <li>define instance variables that store the state of the fixture</li>
|
|
* <li>initialize the fixture state by overriding {@link #setUp()}</li>
|
|
* <li>clean-up after a test by overriding {@link #tearDown()}.</li>
|
|
* </ol>
|
|
* Each test runs in its own fixture so there
|
|
* can be no side effects among test runs.
|
|
* Here is an example:
|
|
* <pre>
|
|
* public class MathTest extends TestCase {
|
|
* protected double fValue1;
|
|
* protected double fValue2;
|
|
*
|
|
* protected void setUp() {
|
|
* fValue1= 2.0;
|
|
* fValue2= 3.0;
|
|
* }
|
|
* }
|
|
* </pre>
|
|
*
|
|
* For each test implement a method which interacts
|
|
* with the fixture. Verify the expected results with assertions specified
|
|
* by calling {@link junit.framework.Assert#assertTrue(String, boolean)} with a boolean.
|
|
* <pre>
|
|
* public void testAdd() {
|
|
* double result= fValue1 + fValue2;
|
|
* assertTrue(result == 5.0);
|
|
* }
|
|
* </pre>
|
|
*
|
|
* Once the methods are defined you can run them. The framework supports
|
|
* both a static type safe and more dynamic way to run a test.
|
|
* In the static way you override the runTest method and define the method to
|
|
* be invoked. A convenient way to do so is with an anonymous inner class.
|
|
* <pre>
|
|
* TestCase test= new MathTest("add") {
|
|
* public void runTest() {
|
|
* testAdd();
|
|
* }
|
|
* };
|
|
* test.run();
|
|
* </pre>
|
|
*
|
|
* The dynamic way uses reflection to implement {@link #runTest()}. It dynamically finds
|
|
* and invokes a method.
|
|
* In this case the name of the test case has to correspond to the test method
|
|
* to be run.
|
|
* <pre>
|
|
* TestCase test= new MathTest("testAdd");
|
|
* test.run();
|
|
* </pre>
|
|
*
|
|
* The tests to be run can be collected into a TestSuite. JUnit provides
|
|
* different <i>test runners</i> which can run a test suite and collect the results.
|
|
* A test runner either expects a static method <code>suite</code> as the entry
|
|
* point to get a test to run or it will extract the suite automatically.
|
|
* <pre>
|
|
* public static Test suite() {
|
|
* suite.addTest(new MathTest("testAdd"));
|
|
* suite.addTest(new MathTest("testDivideByZero"));
|
|
* return suite;
|
|
* }
|
|
* </pre>
|
|
* @see TestResult
|
|
* @see TestSuite
|
|
*/
|
|
public abstract class TestCase extends Assert implements Test {
|
|
/**
|
|
* the name of the test case
|
|
*/
|
|
private String fName;
|
|
|
|
/**
|
|
* No-arg constructor to enable serialization. This method
|
|
* is not intended to be used by mere mortals without calling setName().
|
|
*/
|
|
public TestCase() {
|
|
fName= null;
|
|
}
|
|
/**
|
|
* Constructs a test case with the given name.
|
|
*/
|
|
public TestCase(String name) {
|
|
fName= name;
|
|
}
|
|
/**
|
|
* Counts the number of test cases executed by run(TestResult result).
|
|
*/
|
|
public int countTestCases() {
|
|
return 1;
|
|
}
|
|
/**
|
|
* Creates a default TestResult object
|
|
*
|
|
* @see TestResult
|
|
*/
|
|
protected TestResult createResult() {
|
|
return new TestResult();
|
|
}
|
|
/**
|
|
* A convenience method to run this test, collecting the results with a
|
|
* default TestResult object.
|
|
*
|
|
* @see TestResult
|
|
*/
|
|
public TestResult run() {
|
|
TestResult result= createResult();
|
|
run(result);
|
|
return result;
|
|
}
|
|
/**
|
|
* Runs the test case and collects the results in TestResult.
|
|
*/
|
|
public void run(TestResult result) {
|
|
result.run(this);
|
|
}
|
|
/**
|
|
* Runs the bare test sequence.
|
|
* @throws Throwable if any exception is thrown
|
|
*/
|
|
public void runBare() throws Throwable {
|
|
Throwable exception= null;
|
|
setUp();
|
|
try {
|
|
runTest();
|
|
} catch (Throwable running) {
|
|
exception= running;
|
|
}
|
|
finally {
|
|
try {
|
|
tearDown();
|
|
} catch (Throwable tearingDown) {
|
|
if (exception == null) exception= tearingDown;
|
|
}
|
|
}
|
|
if (exception != null) throw exception;
|
|
}
|
|
/**
|
|
* Override to run the test and assert its state.
|
|
* @throws Throwable if any exception is thrown
|
|
*/
|
|
protected void runTest() throws Throwable {
|
|
assertNotNull("TestCase.fName cannot be null", fName); // Some VMs crash when calling getMethod(null,null);
|
|
Method runMethod= null;
|
|
try {
|
|
// use getMethod to get all public inherited
|
|
// methods. getDeclaredMethods returns all
|
|
// methods of this class but excludes the
|
|
// inherited ones.
|
|
runMethod= getClass().getMethod(fName, (Class[])null);
|
|
} catch (NoSuchMethodException e) {
|
|
fail("Method \""+fName+"\" not found");
|
|
}
|
|
if (!Modifier.isPublic(runMethod.getModifiers())) {
|
|
fail("Method \""+fName+"\" should be public");
|
|
}
|
|
|
|
try {
|
|
runMethod.invoke(this);
|
|
}
|
|
catch (InvocationTargetException e) {
|
|
e.fillInStackTrace();
|
|
throw e.getTargetException();
|
|
}
|
|
catch (IllegalAccessException e) {
|
|
e.fillInStackTrace();
|
|
throw e;
|
|
}
|
|
}
|
|
/**
|
|
* Sets up the fixture, for example, open a network connection.
|
|
* This method is called before a test is executed.
|
|
*/
|
|
protected void setUp() throws Exception {
|
|
}
|
|
/**
|
|
* Tears down the fixture, for example, close a network connection.
|
|
* This method is called after a test is executed.
|
|
*/
|
|
protected void tearDown() throws Exception {
|
|
}
|
|
/**
|
|
* Returns a string representation of the test case
|
|
*/
|
|
@Override
|
|
public String toString() {
|
|
return getName() + "(" + getClass().getName() + ")";
|
|
}
|
|
/**
|
|
* Gets the name of a TestCase
|
|
* @return the name of the TestCase
|
|
*/
|
|
public String getName() {
|
|
return fName;
|
|
}
|
|
/**
|
|
* Sets the name of a TestCase
|
|
* @param name the name to set
|
|
*/
|
|
public void setName(String name) {
|
|
fName= name;
|
|
}
|
|
}
|