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?
Advertisement
Answer
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.: