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