@BeforeEach

  • Use JUnit's BeforeEach annotation to create setup methods.

Notice every unit test we wrote included the following statement

IndexedList numbers = new ArrayIndexedList<>(5, 10);

Here, the size and default value are chosen arbitrarily. Of course, we could have varied them in each unit test, but every unit test certainly requires an IndexedList object.

JUnit lets you annotate a setup method that will be run before each unit test.

Here is a refactored IndexedListTest:

class IndexedListTest {
  private IndexedList numbers;
  private final static int size = 5;
  private final static int defaultValue = 10;

  @BeforeEach
  void setUp() {
    numbers = new ArrayIndexedList<>(size, defaultValue);
  }

  @Test
  @DisplayName("get() returns the default value after IndexedList is instantiated.")
  void testGetAfterConstruction() {
    for (int index = 0; index < numbers.length(); index++) {
      assertEquals(defaultValue, numbers.get(index));
    }
  }

  @Test
  @DisplayName("put() changes the default value after IndexedList is instantiated.")
  void testPutChangesValueAfterConstruction() {
    numbers.put(2, 7);
    assertEquals(7, numbers.get(2));
  }

  @Test
  @DisplayName("put() overwrites the existing value at given index to provided value.")
  void testPutUpdatesValueAtGivenIndex() {
    numbers.put(1, 8);
    assertEquals(8, numbers.get(1));
    numbers.put(1, -5);
    assertEquals(-5, numbers.get(1));
  }

  @Test
  @DisplayName("length() returns the correct size after IndexedList is instantiated.")
  void testLengthAfterConstruction() {
    assertEquals(size, numbers.length());
  }
}

Notice I've also used constant fields (final static) to declare size and default value. It is considered good practice to store such values in constant (final) variables.