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