是否有可能使测试方法参数化,而不是整个类?

时间:2010-09-22 13:17:55

标签: java unit-testing junit junit4

据我所知,使用JUnit 4.x及其注释org.junit.runners.Parameterized我可以使我的单元测试“参数化”,这意味着对于每一组参数,只要从头开始再次执行整个单元测试。

这种方法限制了我,因为我无法创建“参数化方法”,例如:

..
@Test 
public void testValid(Integer salary) {
  Employee e = new Employee();      
  e.setSalary(salary);
  assertEqual(salary, e.getSalary());
}
@Test(expected=EmployeeInvalidSalaryException.class) 
public void testInvalid(Integer salary) {
  Employee e = new Employee();      
  e.setSalary(salary);
}
..

如示例中所示,我需要在一个单元测试中使用两个集合参数。是否可以在JUnit 4.x中执行?例如,它可以在PHPUnit中使用。

PS。也许在其他一些单元测试框架中可以实现这种机制,而不是在JUnit中实现?

3 个答案:

答案 0 :(得分:1)

简单的解决方法(我认为这个问题不在此范围内)是将它们分成两个单独的参数化测试。

如果您倾向于将它们保持在一起,那么为参数化参数集添加额外元素就可以为您提供帮助。此元素应指示给定参数是针对一个测试还是另一个测试(或者如果需要,则为两者)。

private Integer salary;
private boolean valid;

@Test 
public void testValid() {
  if (valid) {
    Employee e = new Employee();      
    e.setSalary(salary);
    assertEqual(salary, e.getSalary());
  }
}

@Test(expected=EmployeeInvalidSalaryException.class) 
public void testInvalid() {
  if (!valid) {
    Employee e = new Employee();      
    e.setSalary(salary);
  }else {
    throw new EmployeeInvalidSalaryException();
  }
}

JUnit参数化测试服务于类 - 而不是方法,所以打破它会更好。

答案 1 :(得分:1)

另一种选择是使用JCheckQuickCheck for Java

答案 2 :(得分:1)

是的,这是可能的。最近我开始了zohhak项目。它让你写:

@TestWith({
   "25 USD, 7",
   "38 GBP, 2",
   "null,   0"
})
public void testMethod(Money money, int anotherParameter) {
   ...
}