1 package junitparams;
2 
3 import junitparams.internal.TestMethod;
4 import org.junit.Rule;
5 import org.junit.Test;
6 import org.junit.rules.ExpectedException;
7 import org.junit.runner.RunWith;
8 import org.junit.runners.model.FrameworkMethod;
9 import org.junit.runners.model.TestClass;
10 
11 import java.lang.reflect.Method;
12 
13 import static org.assertj.core.api.Assertions.assertThat;
14 
15 @RunWith(JUnitParamsRunner.class)
16 public class ParametersReaderProvidersTest {
17 
18     @Rule
19     public ExpectedException exception = ExpectedException.none();
20 
21     @Test
22     @Parameters(source = SingleParamSetProvider.class)
oneParamSetFromClass(String a, String b)23     public void oneParamSetFromClass(String a, String b) {
24         assertThat(a).isEqualTo("a");
25         assertThat(b).isEqualTo("b");
26     }
27 
28     public static class SingleParamSetProvider {
provideOneParamSetSameTypes()29         public static Object[] provideOneParamSetSameTypes() {
30             return new Object[]{"a", "b"};
31         }
32     }
33 
34     @Test
shouldPutProviderClassNameInExceptionMessageForProviderWithNoValidMethods()35     public void shouldPutProviderClassNameInExceptionMessageForProviderWithNoValidMethods() {
36         TestMethod testMethod = getTestMethodWithInvalidProvider();
37 
38         exception.expect(RuntimeException.class);
39         exception.expectMessage(ProviderClassWithNoValidMethods.class.getName());
40         testMethod.parametersSets();
41     }
42 
getTestMethodWithInvalidProvider()43     private TestMethod getTestMethodWithInvalidProvider() {
44         // Bug in original code relied on order of Class.getMethods() which is undefined.
45         try {
46             Method testMethod = TestClassWithProviderClassWithNoValidMethods.class
47                     .getDeclaredMethod("shouldDoNothingItsJustToConnectTestClassWithProvider");
48             return new TestMethod(new FrameworkMethod(testMethod), new TestClass(TestClassWithProviderClassWithNoValidMethods.class));
49         } catch (NoSuchMethodException e) {
50             throw new RuntimeException("Mismatch between method and test class", e);
51         }
52     }
53 
54     @RunWith(JUnitParamsRunner.class)
55     static class TestClassWithProviderClassWithNoValidMethods {
56         @Test
57         @Parameters(source = ProviderClassWithNoValidMethods.class)
shouldDoNothingItsJustToConnectTestClassWithProvider()58         public void shouldDoNothingItsJustToConnectTestClassWithProvider() {
59         }
60     }
61 
62     static class ProviderClassWithNoValidMethods {
63     }
64 
65     @Test
66     @Parameters(source = OneIntegerProvider.class)
providedPrimitiveParams(int integer)67     public void providedPrimitiveParams(int integer) {
68         assertThat(integer).isLessThan(4);
69     }
70 
71     public static class OneIntegerProvider {
provideTwoNumbers()72         public static Object[] provideTwoNumbers() {
73             return new Object[]{new Object[]{1}, new Object[]{2}};
74         }
75 
provideOneNumber()76         public static Object[] provideOneNumber() {
77             return new Object[]{new Object[]{3}};
78         }
79     }
80 
81     @Test
82     @Parameters(source = DomainObjectProvider.class)
providedDomainParams(DomainClass object1, DomainClass object2)83     public void providedDomainParams(DomainClass object1, DomainClass object2) {
84         assertThat(object1.toString()).isEqualTo("testNameOne");
85         assertThat(object2.toString()).isEqualTo("testNameTwo");
86     }
87 
88     public static class DomainObjectProvider {
provideDomainObject()89         public static Object[] provideDomainObject() {
90             return new Object[]{new Object[]{
91                     new DomainClass("testNameOne"),
92                     new DomainClass("testNameTwo")}};
93         }
94     }
95 
96     public static class DomainClass {
97         private final String name;
98 
DomainClass(String name)99         public DomainClass(String name) {
100             this.name = name;
101         }
102 
103         @Override
toString()104         public String toString() {
105             return name;
106         }
107     }
108 }
109