@Parameters Parameterized runner

先看一个例子


package test;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(value = Parameterized.class)
public class ParameterTest {
private double expected;
private double valueOne;
private double valueTwo;

public ParameterTest(double expected, double valueOne, double valueTwo) {
this.expected = expected;
this.valueOne = valueOne;
this.valueTwo = valueTwo;
}

@Parameters
public static Collection<Integer[]> getTestParameters() {
return Arrays.asList(new Integer[][] { { 2, 1, 1 }, // expected,
// valueOne,
// valueTwo
{ 3, 2, 1 }, // expected, valueOne, valueTwo
{ 4, 3, 1 }, // expected, valueOne, valueTwo
});
}

@Test
public void sum() {
Calculator calc = new Calculator();
Assert.assertEquals(expected, calc.add(valueOne, valueTwo), 0);
}
}

通过在Calculator calc = new Calculator();设置断点后调试发现
sum被中断三次
每次this都指向不同的地址,可以发现每次test都会初始化test的环境。

在构造函数中设置断点,发现也中断三次,每次中断下来后可以看到的构造调用的时候的参数也是不一样的。每次的值都是getTestParameters中的三个值中的一个。当然getTestParameters只被调用一次。
可以确定每次构造之前,初始化了参数。

这里使用的runner是Parameterized 。要使用这个runner必须在test的class上面带有@RunWith,并且value=Parameterized的class。

其中必须有一个public的静态方法,它拥有@Parameters注解,来表示这个方法是初始化参数的。返回类型必须是Collection的无参方法。集合中的每个元素必须是数组,数组的长度必须相同。数组的参数个数必须和唯一的构造函数相同。如果public的构造函数有多个,就会抛出assertion
error

你可能感兴趣的:(parameter)