在jUnit测试中将参数传递给@Before

时间:2014-10-14 09:51:35

标签: java unit-testing junit

有没有办法避免在每次测试开始时调用populateRandomData()方法而没有固定的参数100.我需要在执行每个测试之前调用相同的方法来设置数据但我需要更改数量测试数据条目,例如每种情况下都是100。

public class Tester
{

   @Before
    public void setUp() {
        populateRandomData(100)
    }

    @Test
    public void testMethod() {

    }

    private void populateRandomData(n){
        //n times insert random data in table.
    }
}

2 个答案:

答案 0 :(得分:3)

您可以创建参数化JUnit测试,它允许您在单元测试用例中添加要传递的参数数量。看一下示例教程Create Parameterized Test Case

@Rule ,在测试方法上使用此注释来参数化规则的执行使其更加有用。取自JUnit 4.7 @Rules

编辑:

使用@Rule的示例:

下面是允许您初始化将在测试方法中使用的num变量的不同值的类

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

public class Test1 implements TestRule {

    private final int   num;

    public Test1(int num) {
        this.num = num;
    }

    public int getNum() {
        return num;
    }

    public class Test1Statement extends Statement {
        private final Statement statement;

        public Test1Statement(Statement statement, int num) {
            this.statement = statement;
        }

        @Override
        public void evaluate() throws Throwable {
            statement.evaluate();
        }
    }

    @Override
    public Statement apply(Statement statement, Description description) {
        return new Test1Statement(statement, num);
    }
}

下面的类是实际的测试用例类。它包含 JUnit测试用例&在测试方法中设置num变量的值。

import org.junit.Rule;
import org.junit.Test;

public class RuleNumberTester {

    @Rule
    public Test1    test    = null;

    @Rule
    public Test1    test1   = null;

    @Test
    public void num1Test() {
        test = new Test1(111);
        System.out.println("Num 1 : " + test.getNum());
    }

    @Test
    public void num2Test() {
        test1 = new Test1(222);
        System.out.println("Num 2 : " + test1.getNum());
    }
}

输出

测试用例成功执行&显示在控制台上的测试方法中初始化的num变量的值。

Num 1 : 111
Num 2 : 222

答案 1 :(得分:0)

我想您可以使用@Rule来确保每次使用正确的参数调用populateRandomData()

然而,由于您需要维护测试方法名称列表,因此很快就会变得难看。

private static final Map<String, Integer> dataCounts = new HashMap<>();

static {
  // list (or otherwise obtain) counts here
  dataCounts.put("testMethod", 100);
}

@Rule
public TestWatcher watcher = new TestWatcher() {
  @Override
  protected void starting(Description description) {
    Integer count = dataCounts.get(description.getMethodName());
    assertNotNull(count);
    populateRandomData(count.intValue());
  };
};