Home | History | Annotate | Download | only in junitparams
      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)
     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 {
     29         public static Object[] provideOneParamSetSameTypes() {
     30             return new Object[]{"a", "b"};
     31         }
     32     }
     33 
     34     @Test
     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 
     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)
     58         public void shouldDoNothingItsJustToConnectTestClassWithProvider() {
     59         }
     60     }
     61 
     62     static class ProviderClassWithNoValidMethods {
     63     }
     64 
     65     @Test
     66     @Parameters(source = OneIntegerProvider.class)
     67     public void providedPrimitiveParams(int integer) {
     68         assertThat(integer).isLessThan(4);
     69     }
     70 
     71     public static class OneIntegerProvider {
     72         public static Object[] provideTwoNumbers() {
     73             return new Object[]{new Object[]{1}, new Object[]{2}};
     74         }
     75 
     76         public static Object[] provideOneNumber() {
     77             return new Object[]{new Object[]{3}};
     78         }
     79     }
     80 
     81     @Test
     82     @Parameters(source = DomainObjectProvider.class)
     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 {
     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 
     99         public DomainClass(String name) {
    100             this.name = name;
    101         }
    102 
    103         @Override
    104         public String toString() {
    105             return name;
    106         }
    107     }
    108 }
    109