JUnit Confusion: Use ‘extends TestCase’ or ‘@Test’?

JUnit Confusion: Use 'extends TestCase' or '@Test'?

21 May 2024 Stephan Petzl Leave a comment Tech-Help

Understanding the proper use of JUnit can be quite challenging, especially when deciding between the traditional JUnit 3 approach and the newer JUnit 4 (and beyond) methods. This article aims to clarify these differences and guide you on which approach to use.

Approach A: JUnit 3-Style

In JUnit 3, unit tests are created by extending the TestCase class and naming test methods with the prefix “test”. When running the class as a JUnit Test (e.g., in Eclipse), all methods starting with “test” are automatically executed.

    
      import junit.framework.TestCase;

      public class DummyTestA extends TestCase {
          public void testSum() {
              int a = 5;
              int b = 10;
              int result = a + b;
              assertEquals(15, result);
          }
      }
    
  

Approach B: JUnit 4-Style

JUnit 4 introduced the use of annotations, which is now the preferred method. You create a normal class and prepend the @Test annotation to the test methods. This approach offers several advantages, such as easier searchability and more flexibility with @Before, @After, and @Rule annotations.

    
      import org.junit.*;
      import static org.junit.Assert.*;

      public class DummyTestB {
          @Test
          public void Sum() {
              int a = 5;
              int b = 10;
              int result = a + b;
              assertEquals(15, result);
          }
      }
    
  

Testing for Exceptions

One of the significant advantages of JUnit 4 is the ability to test for exceptions using annotations. For example, you can specify an expected exception directly in the @Test annotation.

    
      @Test(expected = ArithmeticException.class)
      public void testForException() {
          int result = 1 / 0;
      }
    
  

In JUnit 3, you need to use a try-catch block to test for exceptions.

    
      public void testForException() {
          try {
              Integer.parseInt("just a string");
              fail("Exception should have been thrown");
          } catch (final Exception e) {
              // expected
          }
      }
    
  

Grouping Tests

In JUnit 3, you can group test classes into a test suite using the TestSuite class.

    
      TestSuite suite = new TestSuite("All tests");
      suite.addTestSuite(DummyTestA.class);
      suite.addTestSuite(DummyTestAbis.class);
    
  

In JUnit 4, you can achieve this by using the @RunWith(Suite.class) and @Suite.SuiteClasses annotations.

    
      import org.junit.runner.RunWith;
      import org.junit.runners.Suite;

      @RunWith(Suite.class)
      @Suite.SuiteClasses({
          Test1.class,
          Test2.class,
          Test3.class,
          Test4.class
      })
      public class TestSuite {
          /* empty class */
      }
    
  

Conclusion

While JUnit 3-style tests are still supported, JUnit 4 and beyond offer a more flexible and powerful approach to writing tests. The use of annotations makes tests more explicit and easier to manage. Unless you need compatibility with older versions of Java or JUnit, it is recommended to use the annotation-based approach.

Automated Testing with Repeato

For those looking to streamline their testing process, consider using Repeato, a no-code test automation tool for iOS and Android. Repeato helps you create, run, and maintain automated tests quickly and efficiently, leveraging computer vision and AI. Its intuitive test recorder and scripting interface allow both novice and advanced testers to automate complex use cases with ease.

Learn more about how Repeato can enhance your testing workflow by visiting our documentation or checking out our blog.

Like this article? there’s more where that came from!