1 package junit.framework; 2 3 import java.lang.reflect.InvocationTargetException; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Modifier; 6 7 /** 8 * A test case defines the fixture to run multiple tests. To define a test case<br/> 9 * <ol> 10 * <li>implement a subclass of <code>TestCase</code></li> 11 * <li>define instance variables that store the state of the fixture</li> 12 * <li>initialize the fixture state by overriding {@link #setUp()}</li> 13 * <li>clean-up after a test by overriding {@link #tearDown()}.</li> 14 * </ol> 15 * Each test runs in its own fixture so there 16 * can be no side effects among test runs. 17 * Here is an example: 18 * <pre> 19 * public class MathTest extends TestCase { 20 * protected double fValue1; 21 * protected double fValue2; 22 * 23 * protected void setUp() { 24 * fValue1= 2.0; 25 * fValue2= 3.0; 26 * } 27 * } 28 * </pre> 29 * 30 * For each test implement a method which interacts 31 * with the fixture. Verify the expected results with assertions specified 32 * by calling {@link junit.framework.Assert#assertTrue(String, boolean)} with a boolean. 33 * <pre> 34 * public void testAdd() { 35 * double result= fValue1 + fValue2; 36 * assertTrue(result == 5.0); 37 * } 38 * </pre> 39 * 40 * Once the methods are defined you can run them. The framework supports 41 * both a static type safe and more dynamic way to run a test. 42 * In the static way you override the runTest method and define the method to 43 * be invoked. A convenient way to do so is with an anonymous inner class. 44 * <pre> 45 * TestCase test= new MathTest("add") { 46 * public void runTest() { 47 * testAdd(); 48 * } 49 * }; 50 * test.run(); 51 * </pre> 52 * The dynamic way uses reflection to implement {@link #runTest()}. It dynamically finds 53 * and invokes a method. 54 * In this case the name of the test case has to correspond to the test method 55 * to be run. 56 * <pre> 57 * TestCase test= new MathTest("testAdd"); 58 * test.run(); 59 * </pre> 60 * 61 * The tests to be run can be collected into a TestSuite. JUnit provides 62 * different <i>test runners</i> which can run a test suite and collect the results. 63 * A test runner either expects a static method <code>suite</code> as the entry 64 * point to get a test to run or it will extract the suite automatically. 65 * <pre> 66 * public static Test suite() { 67 * suite.addTest(new MathTest("testAdd")); 68 * suite.addTest(new MathTest("testDivideByZero")); 69 * return suite; 70 * } 71 * </pre> 72 * 73 * @see TestResult 74 * @see TestSuite 75 */ 76 public abstract class TestCase extends Assert implements Test { 77 /** 78 * the name of the test case 79 */ 80 private String fName; 81 82 /** 83 * No-arg constructor to enable serialization. This method 84 * is not intended to be used by mere mortals without calling setName(). 85 */ TestCase()86 public TestCase() { 87 fName = null; 88 } 89 90 /** 91 * Constructs a test case with the given name. 92 */ TestCase(String name)93 public TestCase(String name) { 94 fName = name; 95 } 96 97 /** 98 * Counts the number of test cases executed by run(TestResult result). 99 */ countTestCases()100 public int countTestCases() { 101 return 1; 102 } 103 104 /** 105 * Creates a default TestResult object 106 * 107 * @see TestResult 108 */ createResult()109 protected TestResult createResult() { 110 return new TestResult(); 111 } 112 113 /** 114 * A convenience method to run this test, collecting the results with a 115 * default TestResult object. 116 * 117 * @see TestResult 118 */ run()119 public TestResult run() { 120 TestResult result = createResult(); 121 run(result); 122 return result; 123 } 124 125 /** 126 * Runs the test case and collects the results in TestResult. 127 */ run(TestResult result)128 public void run(TestResult result) { 129 result.run(this); 130 } 131 132 /** 133 * Runs the bare test sequence. 134 * 135 * @throws Throwable if any exception is thrown 136 */ runBare()137 public void runBare() throws Throwable { 138 Throwable exception = null; 139 setUp(); 140 try { 141 runTest(); 142 } catch (Throwable running) { 143 exception = running; 144 } finally { 145 try { 146 tearDown(); 147 } catch (Throwable tearingDown) { 148 if (exception == null) exception = tearingDown; 149 } 150 } 151 if (exception != null) throw exception; 152 } 153 154 /** 155 * Override to run the test and assert its state. 156 * 157 * @throws Throwable if any exception is thrown 158 */ runTest()159 protected void runTest() throws Throwable { 160 assertNotNull("TestCase.fName cannot be null", fName); // Some VMs crash when calling getMethod(null,null); 161 Method runMethod = null; 162 try { 163 // use getMethod to get all public inherited 164 // methods. getDeclaredMethods returns all 165 // methods of this class but excludes the 166 // inherited ones. 167 runMethod = getClass().getMethod(fName, (Class[]) null); 168 } catch (NoSuchMethodException e) { 169 fail("Method \"" + fName + "\" not found"); 170 } 171 if (!Modifier.isPublic(runMethod.getModifiers())) { 172 fail("Method \"" + fName + "\" should be public"); 173 } 174 175 try { 176 runMethod.invoke(this); 177 } catch (InvocationTargetException e) { 178 e.fillInStackTrace(); 179 throw e.getTargetException(); 180 } catch (IllegalAccessException e) { 181 e.fillInStackTrace(); 182 throw e; 183 } 184 } 185 186 /** 187 * Asserts that a condition is true. If it isn't it throws 188 * an AssertionFailedError with the given message. 189 */ 190 @SuppressWarnings("deprecation") assertTrue(String message, boolean condition)191 public static void assertTrue(String message, boolean condition) { 192 Assert.assertTrue(message, condition); 193 } 194 195 /** 196 * Asserts that a condition is true. If it isn't it throws 197 * an AssertionFailedError. 198 */ 199 @SuppressWarnings("deprecation") assertTrue(boolean condition)200 public static void assertTrue(boolean condition) { 201 Assert.assertTrue(condition); 202 } 203 204 /** 205 * Asserts that a condition is false. If it isn't it throws 206 * an AssertionFailedError with the given message. 207 */ 208 @SuppressWarnings("deprecation") assertFalse(String message, boolean condition)209 public static void assertFalse(String message, boolean condition) { 210 Assert.assertFalse(message, condition); 211 } 212 213 /** 214 * Asserts that a condition is false. If it isn't it throws 215 * an AssertionFailedError. 216 */ 217 @SuppressWarnings("deprecation") assertFalse(boolean condition)218 public static void assertFalse(boolean condition) { 219 Assert.assertFalse(condition); 220 } 221 222 /** 223 * Fails a test with the given message. 224 */ 225 @SuppressWarnings("deprecation") fail(String message)226 public static void fail(String message) { 227 Assert.fail(message); 228 } 229 230 /** 231 * Fails a test with no message. 232 */ 233 @SuppressWarnings("deprecation") fail()234 public static void fail() { 235 Assert.fail(); 236 } 237 238 /** 239 * Asserts that two objects are equal. If they are not 240 * an AssertionFailedError is thrown with the given message. 241 */ 242 @SuppressWarnings("deprecation") assertEquals(String message, Object expected, Object actual)243 public static void assertEquals(String message, Object expected, Object actual) { 244 Assert.assertEquals(message, expected, actual); 245 } 246 247 /** 248 * Asserts that two objects are equal. If they are not 249 * an AssertionFailedError is thrown. 250 */ 251 @SuppressWarnings("deprecation") assertEquals(Object expected, Object actual)252 public static void assertEquals(Object expected, Object actual) { 253 Assert.assertEquals(expected, actual); 254 } 255 256 /** 257 * Asserts that two Strings are equal. 258 */ 259 @SuppressWarnings("deprecation") assertEquals(String message, String expected, String actual)260 public static void assertEquals(String message, String expected, String actual) { 261 Assert.assertEquals(message, expected, actual); 262 } 263 264 /** 265 * Asserts that two Strings are equal. 266 */ 267 @SuppressWarnings("deprecation") assertEquals(String expected, String actual)268 public static void assertEquals(String expected, String actual) { 269 Assert.assertEquals(expected, actual); 270 } 271 272 /** 273 * Asserts that two doubles are equal concerning a delta. If they are not 274 * an AssertionFailedError is thrown with the given message. If the expected 275 * value is infinity then the delta value is ignored. 276 */ 277 @SuppressWarnings("deprecation") assertEquals(String message, double expected, double actual, double delta)278 public static void assertEquals(String message, double expected, double actual, double delta) { 279 Assert.assertEquals(message, expected, actual, delta); 280 } 281 282 /** 283 * Asserts that two doubles are equal concerning a delta. If the expected 284 * value is infinity then the delta value is ignored. 285 */ 286 @SuppressWarnings("deprecation") assertEquals(double expected, double actual, double delta)287 public static void assertEquals(double expected, double actual, double delta) { 288 Assert.assertEquals(expected, actual, delta); 289 } 290 291 /** 292 * Asserts that two floats are equal concerning a positive delta. If they 293 * are not an AssertionFailedError is thrown with the given message. If the 294 * expected value is infinity then the delta value is ignored. 295 */ 296 @SuppressWarnings("deprecation") assertEquals(String message, float expected, float actual, float delta)297 public static void assertEquals(String message, float expected, float actual, float delta) { 298 Assert.assertEquals(message, expected, actual, delta); 299 } 300 301 /** 302 * Asserts that two floats are equal concerning a delta. If the expected 303 * value is infinity then the delta value is ignored. 304 */ 305 @SuppressWarnings("deprecation") assertEquals(float expected, float actual, float delta)306 public static void assertEquals(float expected, float actual, float delta) { 307 Assert.assertEquals(expected, actual, delta); 308 } 309 310 /** 311 * Asserts that two longs are equal. If they are not 312 * an AssertionFailedError is thrown with the given message. 313 */ 314 @SuppressWarnings("deprecation") assertEquals(String message, long expected, long actual)315 public static void assertEquals(String message, long expected, long actual) { 316 Assert.assertEquals(message, expected, actual); 317 } 318 319 /** 320 * Asserts that two longs are equal. 321 */ 322 @SuppressWarnings("deprecation") assertEquals(long expected, long actual)323 public static void assertEquals(long expected, long actual) { 324 Assert.assertEquals(expected, actual); 325 } 326 327 /** 328 * Asserts that two booleans are equal. If they are not 329 * an AssertionFailedError is thrown with the given message. 330 */ 331 @SuppressWarnings("deprecation") assertEquals(String message, boolean expected, boolean actual)332 public static void assertEquals(String message, boolean expected, boolean actual) { 333 Assert.assertEquals(message, expected, actual); 334 } 335 336 /** 337 * Asserts that two booleans are equal. 338 */ 339 @SuppressWarnings("deprecation") assertEquals(boolean expected, boolean actual)340 public static void assertEquals(boolean expected, boolean actual) { 341 Assert.assertEquals(expected, actual); 342 } 343 344 /** 345 * Asserts that two bytes are equal. If they are not 346 * an AssertionFailedError is thrown with the given message. 347 */ 348 @SuppressWarnings("deprecation") assertEquals(String message, byte expected, byte actual)349 public static void assertEquals(String message, byte expected, byte actual) { 350 Assert.assertEquals(message, expected, actual); 351 } 352 353 /** 354 * Asserts that two bytes are equal. 355 */ 356 @SuppressWarnings("deprecation") assertEquals(byte expected, byte actual)357 public static void assertEquals(byte expected, byte actual) { 358 Assert.assertEquals(expected, actual); 359 } 360 361 /** 362 * Asserts that two chars are equal. If they are not 363 * an AssertionFailedError is thrown with the given message. 364 */ 365 @SuppressWarnings("deprecation") assertEquals(String message, char expected, char actual)366 public static void assertEquals(String message, char expected, char actual) { 367 Assert.assertEquals(message, expected, actual); 368 } 369 370 /** 371 * Asserts that two chars are equal. 372 */ 373 @SuppressWarnings("deprecation") assertEquals(char expected, char actual)374 public static void assertEquals(char expected, char actual) { 375 Assert.assertEquals(expected, actual); 376 } 377 378 /** 379 * Asserts that two shorts are equal. If they are not 380 * an AssertionFailedError is thrown with the given message. 381 */ 382 @SuppressWarnings("deprecation") assertEquals(String message, short expected, short actual)383 public static void assertEquals(String message, short expected, short actual) { 384 Assert.assertEquals(message, expected, actual); 385 } 386 387 /** 388 * Asserts that two shorts are equal. 389 */ 390 @SuppressWarnings("deprecation") assertEquals(short expected, short actual)391 public static void assertEquals(short expected, short actual) { 392 Assert.assertEquals(expected, actual); 393 } 394 395 /** 396 * Asserts that two ints are equal. If they are not 397 * an AssertionFailedError is thrown with the given message. 398 */ 399 @SuppressWarnings("deprecation") assertEquals(String message, int expected, int actual)400 public static void assertEquals(String message, int expected, int actual) { 401 Assert.assertEquals(message, expected, actual); 402 } 403 404 /** 405 * Asserts that two ints are equal. 406 */ 407 @SuppressWarnings("deprecation") assertEquals(int expected, int actual)408 public static void assertEquals(int expected, int actual) { 409 Assert.assertEquals(expected, actual); 410 } 411 412 /** 413 * Asserts that an object isn't null. 414 */ 415 @SuppressWarnings("deprecation") assertNotNull(Object object)416 public static void assertNotNull(Object object) { 417 Assert.assertNotNull(object); 418 } 419 420 /** 421 * Asserts that an object isn't null. If it is 422 * an AssertionFailedError is thrown with the given message. 423 */ 424 @SuppressWarnings("deprecation") assertNotNull(String message, Object object)425 public static void assertNotNull(String message, Object object) { 426 Assert.assertNotNull(message, object); 427 } 428 429 /** 430 * Asserts that an object is null. If it isn't an {@link AssertionError} is 431 * thrown. 432 * Message contains: Expected: <null> but was: object 433 * 434 * @param object Object to check or <code>null</code> 435 */ 436 @SuppressWarnings("deprecation") assertNull(Object object)437 public static void assertNull(Object object) { 438 Assert.assertNull(object); 439 } 440 441 /** 442 * Asserts that an object is null. If it is not 443 * an AssertionFailedError is thrown with the given message. 444 */ 445 @SuppressWarnings("deprecation") assertNull(String message, Object object)446 public static void assertNull(String message, Object object) { 447 Assert.assertNull(message, object); 448 } 449 450 /** 451 * Asserts that two objects refer to the same object. If they are not 452 * an AssertionFailedError is thrown with the given message. 453 */ 454 @SuppressWarnings("deprecation") assertSame(String message, Object expected, Object actual)455 public static void assertSame(String message, Object expected, Object actual) { 456 Assert.assertSame(message, expected, actual); 457 } 458 459 /** 460 * Asserts that two objects refer to the same object. If they are not 461 * the same an AssertionFailedError is thrown. 462 */ 463 @SuppressWarnings("deprecation") assertSame(Object expected, Object actual)464 public static void assertSame(Object expected, Object actual) { 465 Assert.assertSame(expected, actual); 466 } 467 468 /** 469 * Asserts that two objects do not refer to the same object. If they do 470 * refer to the same object an AssertionFailedError is thrown with the 471 * given message. 472 */ 473 @SuppressWarnings("deprecation") assertNotSame(String message, Object expected, Object actual)474 public static void assertNotSame(String message, Object expected, Object actual) { 475 Assert.assertNotSame(message, expected, actual); 476 } 477 478 /** 479 * Asserts that two objects do not refer to the same object. If they do 480 * refer to the same object an AssertionFailedError is thrown. 481 */ 482 @SuppressWarnings("deprecation") assertNotSame(Object expected, Object actual)483 public static void assertNotSame(Object expected, Object actual) { 484 Assert.assertNotSame(expected, actual); 485 } 486 487 @SuppressWarnings("deprecation") failSame(String message)488 public static void failSame(String message) { 489 Assert.failSame(message); 490 } 491 492 @SuppressWarnings("deprecation") failNotSame(String message, Object expected, Object actual)493 public static void failNotSame(String message, Object expected, Object actual) { 494 Assert.failNotSame(message, expected, actual); 495 } 496 497 @SuppressWarnings("deprecation") failNotEquals(String message, Object expected, Object actual)498 public static void failNotEquals(String message, Object expected, Object actual) { 499 Assert.failNotEquals(message, expected, actual); 500 } 501 502 @SuppressWarnings("deprecation") format(String message, Object expected, Object actual)503 public static String format(String message, Object expected, Object actual) { 504 return Assert.format(message, expected, actual); 505 } 506 507 /** 508 * Sets up the fixture, for example, open a network connection. 509 * This method is called before a test is executed. 510 */ setUp()511 protected void setUp() throws Exception { 512 } 513 514 /** 515 * Tears down the fixture, for example, close a network connection. 516 * This method is called after a test is executed. 517 */ tearDown()518 protected void tearDown() throws Exception { 519 } 520 521 /** 522 * Returns a string representation of the test case 523 */ 524 @Override toString()525 public String toString() { 526 return getName() + "(" + getClass().getName() + ")"; 527 } 528 529 /** 530 * Gets the name of a TestCase 531 * 532 * @return the name of the TestCase 533 */ getName()534 public String getName() { 535 return fName; 536 } 537 538 /** 539 * Sets the name of a TestCase 540 * 541 * @param name the name to set 542 */ setName(String name)543 public void setName(String name) { 544 fName = name; 545 } 546 } 547