Конструктор 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 ответ
Я не уверен, что полностью следую за вами, но когда тест запущен, вот что происходит:
- Метод, который вы аннотировали с помощью метода @Parameters, вызывается один раз и только один раз.
- Экземпляр запуска теста создается для каждой строки в коллекции, возвращаемой аннотированным методом.
- Тест создается для каждой строки в коллекции параметров с использованием ее конструктора, но он передается в соответствующей строке значения параметра, которая была кэширована из первоначального вызова.
Вы можете увидеть, где это происходит, нажав здесь и здесь. Если вы изменяете состояние между вызовами (используя статический метод или что-то еще), ожидайте увидеть странные вещи.
Изменить: после того, как поковыряться в коде, я лучше понимаю, что вы сейчас спрашиваете. Я только что отладил параметризованный тест с использованием JUnit 4.10, и он действительно вызывает конструктор один раз для каждой строки теста.