Update: after listening to a recent episode of Java Posse, I found out about parameterized tests for JUnit which seems to be a better option than the method described below. Live and learn.
Let’s say you have a lot of similar cases in a jUnit test. You might be tempted to write a loop to factor out the commonalities. Take the following (trivial) example:
public class TestUnitTest { @Test public void testMultiple() throws Exception { Integer cases[][] = { {1, 2, 3}, {2, 3, 6}, {1, 1, 2}, {3, 0, 3}, }; for (Integer[] c : cases) assertEquals((Integer)(c[0] + c[1]), c[2]); } }
The problem is that the exception will be always at the same line. I found that it is easier to factor out the functionality into a method and call that method repeatedly:
public class TestUnitTest { private int sum(int a, int b) { return a + b; } @Test public void testLineByLine() throws Exception { assertEquals(sum(1, 2), 3); assertEquals(sum(2, 3), 6); assertEquals(sum(1, 1), 2); assertEquals(sum(3, 0), 3); } }
This way you will see in your stacktrace which subcase failed exactly.
Picture taken from psd’s photostream with permission.