Java 在jUnit测试中设置之前将参数传递给@

Java 在jUnit测试中设置之前将参数传递给@,java,unit-testing,junit,Java,Unit Testing,Junit,是否有任何方法可以避免在没有固定参数100的情况下,在每个测试开始时调用populateRandomData()方法。在执行每个测试之前,我需要调用相同的方法来设置数据,但我需要更改测试数据项的数量,例如,在每种情况下为100 public class Tester { @Before public void setUp() { populateRandomData(100) } @Test public void testMethod(

是否有任何方法可以避免在没有固定参数100的情况下,在每个测试开始时调用populateRandomData()方法。在执行每个测试之前,我需要调用相同的方法来设置数据,但我需要更改测试数据项的数量,例如,在每种情况下为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.
    }
}

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

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

编辑:

使用@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

我想您可以使用
@规则
来确保每次使用正确的参数调用
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());
  };
};
private static final Map dataCounts=new HashMap();
静止的{
//在此列出(或以其他方式获取)计数
dataCounts.put(“testMethod”,100);
}
@统治
publictestwatcher=newtestwatcher(){
@凌驾
受保护的无效启动(说明){
整数计数=dataCounts.get(description.getMethodName());
assertNotNull(计数);
populateRandomData(count.intValue());
};
};

您的意思是一个测试方法需要另一个参数来调用
populateRandomData
作为另一个测试方法?这对测试类来说仍然是本地的吗?而且。。。基于什么参数变化?@Seelenvirtuose是的,这是一种局部实用方法。在问题中添加了代码。只需在每个问题中调用
populateRandomData(xxx)
test@NeilGhosh每个测试是否对随机数据做了不同的处理?如果不是,这可能是一个参数化测试,其中唯一改变的是随机数据对象的数量。否则,我很难找到比在每个测试中调用
populateRandomData()
更好的解决方案。@NeilGhosh每个测试都需要某种方法来表示它需要多少随机数据。我很难想出比让他们每次调用
populateRandomData()
更简单的方法。除非您希望将测试类拆分为多个类,从一个公共父类扩展而来,该父类要求将数据项的数量作为构造函数参数。请注意,我不希望同一测试使用不同的数据多次运行。我希望不同的测试在前后使用一个通用的设置代码,但设置有点不同。@NeilGhosh我已经用@Rule的示例代码更新了我的答案。看看它&让我知道它是否对你有用。嗯,看起来对于这个简单的例子不值得,我现在只想在每个测试中显式调用setup方法。