JUnit параметризован - создать один экземпляр для каждого параметра

Мне было неприятно найти в параметризованной документации, что "при запуске параметризованного тестового класса создаются экземпляры для кросс-продукта тестовых методов и теста элементов данных". Это означает, что конструктор запускается один раз для каждого отдельного теста, а не перед запуском всех тестов. У меня есть дорогостоящая операция (1-5 секунд), которую я положил в конструктор, и теперь операция повторяется слишком много раз, что замедляет работу всего набора тестов. Операция нужна только один раз, чтобы установить состояние для всех тестов. Как запустить несколько тестов с одним экземпляром параметризованного теста?

1 ответ

Я перенес бы дорогостоящую операцию в метод @BeforeClass, который должен выполняться только один раз для всего параметризованного теста.

Ниже приведен глупый пример:

@RunWith(Parameterized.class)
public class QuickTest {
 private static Object expensiveObject; 
 private final int value;
 @BeforeClass
 public static void before() {
 System.out.println("Before class!");
 expensiveObject = new String("Just joking!");
 }
 @Parameters
 public static Collection<object[]> data() {
 return Arrays.asList(new Object[][] { { 1 }, { 2 } });
 } 
 public QuickTest(int value) {
 this.value = value;
 }
 @Test
 public void test() {
 System.out.println(String.format("Ran test #%d.", value));
 System.out.println(expensiveObject);
 }
}
</object[]>

Будет напечатан:

Before class!
Ran test #1.
Just joking!
Ran test #2.
Just joking!

licensed under cc by-sa 3.0 with attribution.