Можно ли сделать параметризованный тестовый метод, а не целый класс? - PullRequest
3 голосов
/ 22 сентября 2010

Как я понимаю, с помощью 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, например.

пс. Может быть, такой механизм можно реализовать в какой-то другой среде модульного тестирования, а не в JUnit?

Ответы [ 3 ]

1 голос
/ 09 марта 2011

Другой вариант - использовать JCheck или QuickCheck для Java

1 голос
/ 06 декабря 2012

да, это возможно. Недавно я начал проект zohhak . позволяет писать:

@TestWith({
   "25 USD, 7",
   "38 GBP, 2",
   "null,   0"
})
public void testMethod(Money money, int anotherParameter) {
   ...
}
1 голос
/ 22 сентября 2010

Простой обходной путь (который, я полагаю, выходит за рамки этого вопроса) состоит в том, чтобы разбить их на 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 служат классам, а не методам, поэтому разбиение его работает намного лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...