有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

据我所知,JUnit4。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);
}
..

如示例所示,我需要在一个单元测试中收集两组参数。在JUnit4中可以这样做吗。十、例如,在PHPUnit中是可能的

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


共 (3) 个答案

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

  2. # 2 楼答案

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

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