【问题标题】:is it possible to make test method parameterized, not an entire class?是否可以将测试方法参数化,而不是整个类?
【发布时间】:2023-04-09 23:40:02
【问题描述】:

据我了解,使用 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 中?

【问题讨论】:

  • TestNG 确实支持

标签: java unit-testing junit junit4


【解决方案1】:

简单的解决方法(我认为超出了这个问题的范围)是将它们分成 2 个单独的参数化测试。

如果您倾向于将它们放在一起,那么向参数化的参数集添加额外的元素就可以解决问题。此元素应指示给定参数是用于一个测试还是另一个(或两者都需要,如果需要)。

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 参数化测试服务于类 - 而不是方法,因此将其分解会更好。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      另一种选择是使用JCheckQuickCheck for Java

      【讨论】:

      • 您能给我们举个例子来说明如何使用 JCheck 来解决问题吗?
      猜你喜欢
      • 2011-06-16
      • 2011-01-25
      • 2019-04-04
      • 2013-12-07
      • 2011-07-17
      • 2020-05-31
      • 2014-06-21
      • 2020-09-15
      • 1970-01-01
      相关资源
      最近更新 更多