22

I have a JUnit 4 test that loops through an array of test data:

public @Test void testAll() {

    final Object[][] sets = new Object[][] {
            // SET                              TYPE VALUE

            // --- valid sets

            // groups
            x(s(A,1, B,1, C,1),                 G),
            x(s(A,4, B,4, D,4),                 G),
            x(s(A,8, B,8, D,8, C,8),            G),
            x(s(J,J, B,4, D,4),                 G,  4*3),
            x(s(A,9, J,J, D,9),                 G,  9*3),
            x(s(A,2, B,2, C,2),                 G),
            x(s(A,4, B,4, J,J),                 G,  4*3),
            x(s(A,4, B,4, C,4, D,4),            G),

            // runs
            x(s(A,1, A,2, A,3),                 R),
            x(s(B,8, B,9, B,10),                R),
            x(s(J,J, C,2, C,3),                 R,  6),
            x(s(D,8, D,9, J,J, D,11),           R,  38),
            x(s(D,8, D,9, J,J, J,J),            R,  38),

            // sames
            x(s(A,1, A,1),                      S),
            x(s(B,4, B,4, B,4),                 S),
            x(s(C,8, C,8),                      S),
            x(s(D,3, D,3),                      S),

            // doubt-cases, assume group (TODO: verify this is correct)
            x(s(J,J, J,J, D,4),                 G,  4*3),
            x(s(A,7, J,J, J,J),                 G,  7*3),
            x(s(J,J, D,9, J,J),                 G,  9*3),
            x(s(J,J, J,J, J,J),                 G,  1),

            // --- invalid sets
            x(s(B,1, A,2, A,3),                 I), // not same colour
            x(s(D,11, D,12, J,J, J,J),          I), // last joker is 14
            x(s(B,1, B,1, A,1),                 I), // duplicate B1
            x(s(A,1, A,2, A,3, A,5),            I), // gap A4
            x(s(J,J, A,1, J,J, B,1, C,1),       I), // one J replaces D1, then nothing left to replace
            x(s(A,1, A,2),                      I), // short
            x(s(B,1),                           I), // shorter
            x(s(A,5, A,6),                      I), // short
    };

    for (Object[] o : sets) {

        TileSet s = (TileSet) o[0];
        Type t = (Type) o[1];
        int v = (Integer) o[2];

        System.out.println(s);

        assertEquals(t, s.getType());
        assertEquals(v, s.getValue());

        // test isValid, though it's Too Simple To Break(R)
        if (t == Type.INVALID) assertFalse(s.isValid());
        else assertTrue(s.isValid());
    }

}

Because it's all in one test method, the whole test stops as soon as one element in the array fails. Is there a way around that, without making a method for each test item? Maybe something with reflection?

2
  • 1
    If you need it to continue through assert failures, how about building up a list of elements that fail, as you're looping, then asserting that the list is empty after the loop? If it's not empty, print out the list of failures. Commented Nov 22, 2010 at 16:58
  • @birryree how would you do this? wouldn't the looping stop once an element fails? I'm a beginner btw. Commented Mar 5, 2013 at 10:08

3 Answers 3

23

Use JUnit 4's parameterized tests. They are a perfect fit for this type of problem, although the documentation is quite lacking.

Here are a few other samples on how to use them.:

Sign up to request clarification or add additional context in comments.

4 Comments

This is exactly what I need. One thing though, is there a way to show the toString() of the test data in the test results? It's inconvenient to have to keep looking them up by array index.
you might want to look into either subclassing the Parameterized runner or providing your own implementation and overriding the getName() method inside the inner class TestClassRunnerForParameters
Is something like this possible on the (@Test) method level? I want to repeat only some methods in the class and I already use @RunWith for something else.
Is there a way to do this without relying on static Parameters? I'm using some random data generation for my parameters...
5

catch AssertionError and add the caught error to the errors list, at the end check the list to be empty raise a compound AssertionError if not.

3 Comments

The errors list? Is that just a list I'll have to make, or a built-in JUnit thing?
@Bart you have to make it. BTW, it is a good habit to instantiate test data in setUp and make small test... methods.
I know, but I have too much test data for that (what's currently there will be expanded some more).
3

Parameterized Tests in JUnit 5 have got easier with a better syntax, I think. You can read about here. One of the options is to declare a method to provide the list of arguments to test, such as below:

// Given
private static Stream<Arguments> shouldReturnExpectedResultWhenGivenRightInput() {
   return Stream.of(
       Arguments.of(3, "Fizz"),
       Arguments.of(5, "Buzz"),
       Arguments.of(8, "8"),
       Arguments.of(15, "FizzBuzz"),
       Arguments.of(19, "19"),
       Arguments.of(30, "FizzBuzz"),
       Arguments.of(40, "Buzz"),
       Arguments.of(45, "FizzBuzz")
   );
}
@ParameterizedTest
@MethodSource
void shouldReturnExpectedResultWhenGivenRightInput(Integer input, String expected) {
   // When
   val result = library.processInput(input); 
   // Then
   assertEquals(expected, result);
}

// Given
private static Stream<Arguments> shouldNotReturnExpectedResultWhenGivenWrongInput() {
    return Stream.of(
        Arguments.of(3, "Buzz"),
        Arguments.of(5, "Fizz"),
        Arguments.of(8, "Buzz"),
        Arguments.of(15, "15"),
        Arguments.of(19, "Fizz")
    );
}
@ParameterizedTest
@MethodSource
void shouldNotReturnExpectedResultWhenGivenWrongInput(Integer input, String unexpected) {
    // When
    val result = library.processInput(input); 
    // Then
    assertNotEquals(unexpected, result);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.