Quickstart

如果你只是想看JUnitParams的一些简单使用和主要用法,你可以查看这里(建议动手开发之前阅读一遍)

  1. 如何使用? 比如说有一个Person类:

     public class Person {
         private int age;
    
         public Person(int age) {
             this.age = age;
         }
    
         public boolean isAdult() {
             return age >= 18;
         }
    
         @Override
         public String toString() {
             return "Person of age: " + age;
         }
     }
    

    然后你要去测试它,于是你需要创建一个测试类并且定义一个JUnitParamsRunner,比如:

     @RunWith(JUnitParamsRunner.class)
     public class PersonTest {
    ...
    

    现在假设你想有一个简单的测试,检查某特定年龄的人是成年人。您可以用@Parameters注解定义测试参数值:

     @Test
     @Parameters({ "17, false", "22, true" })
     public void personIsAdult(int age, boolean valid) throws Exception {
         assertThat(new Person(age).isAdult(), is(valid));
     }
    

    上面代码中有几个值是确定的,如果你想要有更多的值,如果你想要更多的值,你可以在类中写一个方法来提供你需要的值:

     @Test
     @Parameters(method = "adultValues")
     public void personIsAdult(int age, boolean valid) throws Exception {
         assertEquals(valid, new Person(age).isAdult());
     }
     private Object[] adultValues() {
         return new Object[]{
                      new Object[]{13, false},
                      new Object[]{17, false},
                      new Object[]{18, true},
                      new Object[]{22, true}
                 };
     }
    

    如果你的测试方法名不长,你可以忽略@Parameters注解中的method参数,只需要将提供值的方法的名称跟你的测试方法名类似(以parametersFor开头+测试方法名),如下:

     @Test
     @Parameters
     public void personIsAdult(int age, boolean valid) throws Exception {
         assertEquals(valid, new Person(age).isAdult());
     }
    
     private Object[] parametersForPersonIsAdult() {
         return new Object[]{
                      new Object[]{13, false},
                      new Object[]{17, false},
                      new Object[]{18, true},
                      new Object[]{22, true}
             };
     }
    

    是不是感觉这个测试并不符合面向对象思想?在这个测试方法中有一个非常愚蠢的构造函数调用,那么让我们传递整个Person对象:

     @Test
     @Parameters
     public void isAdult(Person person, boolean valid) throws Exception {
         assertThat(person.isAdult(), is(valid));
     }
    
     private Object[] parametersForIsAdult() {
         return new Object[]{
                      new Object[]{new Person(13), false},
                      new Object[]{new Person(17), false},
                      new Object[]{new Person(18), true},
                      new Object[]{new Person(22), true}
                 };
     }
    

    有时候你需要一些外部依赖来提供参数(为啥呢?可能因为它的复杂度,会干扰测试类,也可能是因为你已经拥有它).JUnitParams还提供了从文件或者数据库读取参数的功能,如下:

     @Test
     @Parameters(source = PersonProvider.class)
     public void personIsAdult(Person person, boolean valid) {
         assertThat(person.isAdult(), is(valid));
     }
    

    此时PersonProvider类必须至少有一个静态方法来提供对象数组,通常像下面这样:

     public class PersonProvider {
         public static Object[] provideAdults() {
             return new Object[]{
                      new Object[]{new Person(25), true},
                      new Object[]{new Person(32), true}
                    };
         }
    
         public static Object[] provideTeens() {
             return new Object[]{
                      new Object[]{new Person(12), false},
                      new Object[]{new Person(17), false}
                    };
         }
     }
    

results matching ""

    No results matching ""