Конструктор Junit Test Case вызывает параметризованный бегун

Я написал длинный параметризованный тест, одним из параметров которого является вызов конструктора с синтаксисом в двойных скобках для создания отдельного объекта для каждой строки двумерного массива:

Object[][] data = new Object[][] {
{ 1, 2, 3, new Blah() {{ setA(); }} }
{ 1, 2, 3, new Blah() {{ setB(); }} }
...

Поскольку философия JUnit заключается в том, чтобы вызывать конструктор тестовых случаев для каждого @Test, я предполагал, что он будет делать то же самое с параметризованными тестами - но я вижу, что он вызывает только этот конструктор (конструктор, определенный для параметризованного теста) один раз за ряд, а не один раз за тест на ряд.

Таким образом, тестовые поля ведут себя глобально, а тесты влияют друг на друга. Я хочу знать, есть ли способ заставить бегуна вызывать конструктор для каждого теста, как с обычным бегуном JUnit. Google и страницы JUnit не помогают мне в этом деле. Я бы действительно не хотел переписывать весь тест, который на данный момент достаточно обширный и читаемый.

1 ответ

Решение

Я не уверен, что полностью следую за вами, но когда тест запущен, вот что происходит:

  1. Метод, который вы аннотировали с помощью метода @Parameters, вызывается один раз и только один раз.
  2. Экземпляр запуска теста создается для каждой строки в коллекции, возвращаемой аннотированным методом.
  3. Тест создается для каждой строки в коллекции параметров с использованием ее конструктора, но он передается в соответствующей строке значения параметра, которая была кэширована из первоначального вызова.

Вы можете увидеть, где это происходит, нажав здесь и здесь. Если вы изменяете состояние между вызовами (используя статический метод или что-то еще), ожидайте увидеть странные вещи.

Изменить: после того, как поковыряться в коде, я лучше понимаю, что вы сейчас спрашиваете. Я только что отладил параметризованный тест с использованием JUnit 4.10, и он действительно вызывает конструктор один раз для каждой строки теста.

Другие вопросы по тегам