View Javadoc
1   package org.junit.tests.running.classes;
2   
3   import static java.util.Arrays.asList;
4   import static org.hamcrest.CoreMatchers.containsString;
5   import static org.junit.Assert.assertEquals;
6   import static org.junit.Assert.assertThat;
7   import static org.junit.Assert.assertTrue;
8   import static org.junit.experimental.results.PrintableResult.testResult;
9   
10  import java.util.Arrays;
11  import java.util.Collection;
12  import java.util.Collections;
13  import java.util.List;
14  
15  import org.junit.AfterClass;
16  import org.junit.BeforeClass;
17  import org.junit.Test;
18  import org.junit.runner.Description;
19  import org.junit.runner.JUnitCore;
20  import org.junit.runner.Request;
21  import org.junit.runner.Result;
22  import org.junit.runner.RunWith;
23  import org.junit.runner.Runner;
24  import org.junit.runner.notification.Failure;
25  import org.junit.runners.Parameterized;
26  import org.junit.runners.Parameterized.Parameter;
27  import org.junit.runners.Parameterized.Parameters;
28  import org.junit.runners.Parameterized.UseParametersRunnerFactory;
29  import org.junit.runners.model.InitializationError;
30  import org.junit.runners.parameterized.ParametersRunnerFactory;
31  import org.junit.runners.parameterized.TestWithParameters;
32  
33  public class ParameterizedTestTest {
34      @RunWith(Parameterized.class)
35      static public class FibonacciTest {
36          @Parameters(name = "{index}: fib({0})={1}")
37          public static Iterable<Object[]> data() {
38              return Arrays.asList(new Object[][]{{0, 0}, {1, 1}, {2, 1},
39                      {3, 2}, {4, 3}, {5, 5}, {6, 8}});
40          }
41  
42          private final int fInput;
43  
44          private final int fExpected;
45  
46          public FibonacciTest(int input, int expected) {
47              fInput = input;
48              fExpected = expected;
49          }
50  
51          @Test
52          public void test() {
53              assertEquals(fExpected, fib(fInput));
54          }
55  
56          private int fib(int x) {
57              return 0;
58          }
59      }
60  
61      @Test
62      public void count() {
63          Result result = JUnitCore.runClasses(FibonacciTest.class);
64          assertEquals(7, result.getRunCount());
65          assertEquals(6, result.getFailureCount());
66      }
67  
68      @Test
69      public void failuresNamedCorrectly() {
70          Result result = JUnitCore.runClasses(FibonacciTest.class);
71          assertEquals(
72                  "test[1: fib(1)=1](" + FibonacciTest.class.getName() + ")",
73                  result.getFailures().get(0).getTestHeader());
74      }
75  
76      @Test
77      public void countBeforeRun() throws Exception {
78          Runner runner = Request.aClass(FibonacciTest.class).getRunner();
79          assertEquals(7, runner.testCount());
80      }
81  
82      @Test
83      public void plansNamedCorrectly() throws Exception {
84          Runner runner = Request.aClass(FibonacciTest.class).getRunner();
85          Description description = runner.getDescription();
86          assertEquals("[0: fib(0)=0]", description.getChildren().get(0)
87                  .getDisplayName());
88      }
89  
90      @RunWith(Parameterized.class)
91      public static class ParameterizedWithoutSpecialTestname {
92          @Parameters
93          public static Collection<Object[]> data() {
94              return Arrays.asList(new Object[][]{{3}, {3}});
95          }
96  
97          public ParameterizedWithoutSpecialTestname(Object something) {
98          }
99  
100         @Test
101         public void testSomething() {
102         }
103     }
104 
105     @Test
106     public void usesIndexAsTestName() {
107         Runner runner = Request
108                 .aClass(ParameterizedWithoutSpecialTestname.class).getRunner();
109         Description description = runner.getDescription();
110         assertEquals("[1]", description.getChildren().get(1).getDisplayName());
111     }
112 
113     @RunWith(Parameterized.class)
114     static public class FibonacciWithParameterizedFieldTest {
115         @Parameters
116         public static Collection<Object[]> data() {
117             return Arrays.asList(new Object[][]{{0, 0}, {1, 1}, {2, 1},
118                     {3, 2}, {4, 3}, {5, 5}, {6, 8}});
119         }
120 
121         @Parameter(0)
122         public int fInput;
123 
124         @Parameter(1)
125         public int fExpected;
126 
127         @Test
128         public void test() {
129             assertEquals(fExpected, fib(fInput));
130         }
131 
132         private int fib(int x) {
133             return 0;
134         }
135     }
136 
137     @Test
138     public void countWithParameterizedField() {
139         Result result = JUnitCore.runClasses(FibonacciWithParameterizedFieldTest.class);
140         assertEquals(7, result.getRunCount());
141         assertEquals(6, result.getFailureCount());
142     }
143 
144     @Test
145     public void failuresNamedCorrectlyWithParameterizedField() {
146         Result result = JUnitCore.runClasses(FibonacciWithParameterizedFieldTest.class);
147         assertEquals(String
148                 .format("test[1](%s)", FibonacciWithParameterizedFieldTest.class.getName()), result
149                 .getFailures().get(0).getTestHeader());
150     }
151 
152     @Test
153     public void countBeforeRunWithParameterizedField() throws Exception {
154         Runner runner = Request.aClass(FibonacciWithParameterizedFieldTest.class).getRunner();
155         assertEquals(7, runner.testCount());
156     }
157 
158     @Test
159     public void plansNamedCorrectlyWithParameterizedField() throws Exception {
160         Runner runner = Request.aClass(FibonacciWithParameterizedFieldTest.class).getRunner();
161         Description description = runner.getDescription();
162         assertEquals("[0]", description.getChildren().get(0).getDisplayName());
163     }
164 
165     @RunWith(Parameterized.class)
166     static public class BadIndexForAnnotatedFieldTest {
167         @Parameters
168         public static Collection<Object[]> data() {
169             return Arrays.asList(new Object[][]{{0}});
170         }
171 
172         @Parameter(2)
173         public int fInput;
174 
175         public int fExpected;
176 
177         @Test
178         public void test() {
179             assertEquals(fExpected, fib(fInput));
180         }
181 
182         private int fib(int x) {
183             return 0;
184         }
185     }
186 
187     @Test
188     public void failureOnInitialization() {
189         Result result = JUnitCore.runClasses(BadIndexForAnnotatedFieldTest.class);
190         assertEquals(2, result.getFailureCount());
191         List<Failure> failures = result.getFailures();
192         assertEquals("Invalid @Parameter value: 2. @Parameter fields counted: 1. Please use an index between 0 and 0.",
193                 failures.get(0).getException().getMessage());
194         assertEquals("@Parameter(0) is never used.", failures.get(1).getException().getMessage());
195     }
196 
197     @RunWith(Parameterized.class)
198     static public class BadNumberOfAnnotatedFieldTest {
199         @Parameters
200         public static Collection<Object[]> data() {
201             return Arrays.asList(new Object[][]{{0, 0}});
202         }
203 
204         @Parameter(0)
205         public int fInput;
206 
207         public int fExpected;
208 
209         @Test
210         public void test() {
211             assertEquals(fExpected, fib(fInput));
212         }
213 
214         private int fib(int x) {
215             return 0;
216         }
217     }
218 
219     @Test
220     public void numberOfFieldsAndParametersShouldMatch() {
221         Result result = JUnitCore.runClasses(BadNumberOfAnnotatedFieldTest.class);
222         assertEquals(1, result.getFailureCount());
223         List<Failure> failures = result.getFailures();
224         assertTrue(failures.get(0).getException().getMessage().contains("Wrong number of parameters and @Parameter fields. @Parameter fields counted: 1, available parameters: 2."));
225     }
226 
227     private static String fLog;
228 
229     @RunWith(Parameterized.class)
230     static public class BeforeAndAfter {
231         @BeforeClass
232         public static void before() {
233             fLog += "before ";
234         }
235 
236         @AfterClass
237         public static void after() {
238             fLog += "after ";
239         }
240 
241         public BeforeAndAfter(int x) {
242 
243         }
244 
245         @Parameters
246         public static Collection<Object[]> data() {
247             return Arrays.asList(new Object[][]{{3}});
248         }
249 
250         @Test
251         public void aTest() {
252         }
253     }
254 
255     @Test
256     public void beforeAndAfterClassAreRun() {
257         fLog = "";
258         JUnitCore.runClasses(BeforeAndAfter.class);
259         assertEquals("before after ", fLog);
260     }
261 
262     @RunWith(Parameterized.class)
263     static public class EmptyTest {
264         @BeforeClass
265         public static void before() {
266             fLog += "before ";
267         }
268 
269         @AfterClass
270         public static void after() {
271             fLog += "after ";
272         }
273     }
274 
275     @Test
276     public void validateClassCatchesNoParameters() {
277         Result result = JUnitCore.runClasses(EmptyTest.class);
278         assertEquals(1, result.getFailureCount());
279     }
280 
281     @RunWith(Parameterized.class)
282     static public class IncorrectTest {
283         @Test
284         public int test() {
285             return 0;
286         }
287 
288         @Parameters
289         public static Collection<Object[]> data() {
290             return Collections.singletonList(new Object[]{1});
291         }
292     }
293 
294     @Test
295     public void failuresAddedForBadTestMethod() throws Exception {
296         Result result = JUnitCore.runClasses(IncorrectTest.class);
297         assertEquals(1, result.getFailureCount());
298     }
299 
300     @RunWith(Parameterized.class)
301     static public class ProtectedParametersTest {
302         @Parameters
303         protected static Collection<Object[]> data() {
304             return Collections.emptyList();
305         }
306 
307         @Test
308         public void aTest() {
309         }
310     }
311 
312     @Test
313     public void meaningfulFailureWhenParametersNotPublic() {
314         assertTestCreatesSingleFailureWithMessage(ProtectedParametersTest.class,
315                 "No public static parameters method on class "
316                         + ProtectedParametersTest.class.getName());
317     }
318 
319     @RunWith(Parameterized.class)
320     static public class ParametersNotIterable {
321         @Parameters
322         public static String data() {
323             return "foo";
324         }
325 
326         @Test
327         public void aTest() {
328         }
329     }
330 
331     @Test
332     public void meaningfulFailureWhenParametersAreNotAnIterable() {
333         assertThat(
334                 testResult(ParametersNotIterable.class).toString(),
335                 containsString("ParametersNotIterable.data() must return an Iterable of arrays."));
336     }
337 
338     @RunWith(Parameterized.class)
339     static public class PrivateConstructor {
340         private PrivateConstructor(int x) {
341 
342         }
343 
344         @Parameters
345         public static Collection<Object[]> data() {
346             return Arrays.asList(new Object[][]{{3}});
347         }
348 
349         @Test
350         public void aTest() {
351         }
352     }
353 
354     @Test(expected = InitializationError.class)
355     public void exceptionWhenPrivateConstructor() throws Throwable {
356         new Parameterized(PrivateConstructor.class);
357     }
358 
359     @RunWith(Parameterized.class)
360     static public class FibonacciTestWithArray {
361         @Parameters(name= "{index}: fib({0})={1}")
362         public static Object[][] data() {
363             return new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
364                 { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } };
365         }
366 
367         private final int fInput;
368 
369         private final int fExpected;
370 
371         public FibonacciTestWithArray(int input, int expected) {
372             fInput= input;
373             fExpected= expected;
374         }
375 
376         @Test
377         public void test() {
378             assertEquals(fExpected, fib(fInput));
379         }
380 
381         private int fib(int x) {
382             return 0;
383         }
384     }
385 
386     @Test
387     public void runsEveryTestOfArray() {
388         Result result= JUnitCore.runClasses(FibonacciTestWithArray.class);
389         assertEquals(7, result.getRunCount());
390     }
391 
392     @RunWith(Parameterized.class)
393     static public class SingleArgumentTestWithArray {
394         @Parameters
395         public static Object[] data() {
396             return new Object[] { "first test", "second test" };
397         }
398 
399         public SingleArgumentTestWithArray(Object argument) {
400         }
401 
402         @Test
403         public void aTest() {
404         }
405     }
406 
407     @Test
408     public void runsForEverySingleArgumentOfArray() {
409         Result result= JUnitCore.runClasses(SingleArgumentTestWithArray.class);
410         assertEquals(2, result.getRunCount());
411     }
412 
413     @RunWith(Parameterized.class)
414     static public class SingleArgumentTestWithIterable {
415         @Parameters
416         public static Iterable<? extends Object> data() {
417             return asList("first test", "second test");
418         }
419 
420         public SingleArgumentTestWithIterable(Object argument) {
421         }
422 
423         @Test
424         public void aTest() {
425         }
426   	}
427 
428     @Test
429     public void runsForEverySingleArgumentOfIterable() {
430         Result result= JUnitCore
431                 .runClasses(SingleArgumentTestWithIterable.class);
432         assertEquals(2, result.getRunCount());
433     }
434 
435     static public class ExceptionThrowingRunnerFactory implements
436             ParametersRunnerFactory {
437         public Runner createRunnerForTestWithParameters(TestWithParameters test)
438                 throws InitializationError {
439             throw new InitializationError(
440                     "Called ExceptionThrowingRunnerFactory.");
441         }
442     }
443 
444     @RunWith(Parameterized.class)
445     @UseParametersRunnerFactory(ExceptionThrowingRunnerFactory.class)
446     static public class TestWithUseParametersRunnerFactoryAnnotation {
447         @Parameters
448         public static Iterable<? extends Object> data() {
449             return asList("single test");
450         }
451 
452         public TestWithUseParametersRunnerFactoryAnnotation(Object argument) {
453         }
454 
455         @Test
456         public void aTest() {
457         }
458     }
459 
460     @Test
461     public void usesParametersRunnerFactoryThatWasSpecifiedByAnnotation() {
462         assertTestCreatesSingleFailureWithMessage(
463                 TestWithUseParametersRunnerFactoryAnnotation.class,
464                 "Called ExceptionThrowingRunnerFactory.");
465     }
466 
467     private void assertTestCreatesSingleFailureWithMessage(Class<?> test, String message) {
468         Result result = JUnitCore.runClasses(test);
469         assertEquals(1, result.getFailures().size());
470         assertEquals(message, result.getFailures().get(0).getMessage());
471     }
472     
473     @RunWith(Parameterized.class)
474     @UseParametersRunnerFactory(ExceptionThrowingRunnerFactory.class)
475     public static abstract class UseParameterizedFactoryAbstractTest {
476         @Parameters
477         public static Iterable<? extends Object> data() {
478             return asList("single test");
479         }
480     }
481     
482     public static class UseParameterizedFactoryTest extends
483             UseParameterizedFactoryAbstractTest {
484 
485         public UseParameterizedFactoryTest(String parameter) {
486 
487         }
488 
489         @Test
490         public void parameterizedTest() {
491         }
492     }
493     
494     @Test
495     public void usesParametersRunnerFactoryThatWasSpecifiedByAnnotationInSuperClass() {
496         assertTestCreatesSingleFailureWithMessage(
497                 UseParameterizedFactoryTest.class,
498                 "Called ExceptionThrowingRunnerFactory.");
499     }
500 }