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

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

До сих пор я делал это с параметризованными тестами, но только что узнал, что они создают новый экземпляр для каждого метода тестирования.

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

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

Я написал пример кода/вывода ниже, чтобы лучше показать, что я ищу:

@RunWith(Parameterized.class)
public class MyTestClass {

    private static Resource expensiveToCreateResource;

    public MyTestClass(String url) {
        System.out.println("Constructing resource for " + url);
        expensiveToCreateResource = new Resource(url); //This is getting created 4x, which is wrong
    }

    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {{"url1"},{"url2"}});
    }

    @Test
    public test1() {
        expensiveToCreateResource.method1();
        System.out.println("test1");
    }

    @Test 
    public test2() {
        expensiveToCreateResource.method2();
        System.out.println("test2");
    }
}

будет производить вывод:

Constructing resource for url1
test1
test2
Constructing resource for url2
test1
test2

Есть идеи/решения? Спасибо.


person Cory Shiraishi    schedule 05.07.2013    source источник


Ответы (1)


Если вы хотите, чтобы экземпляр класса создавался один раз для каждого параметра, вам придется написать свой собственный тестировщик JUnit. Вместо этого я бы попытался кэшировать информацию по мере необходимости, например. в статической карте, которая сопоставляет URL-адреса с ресурсами.

person Peter Niederwieser    schedule 07.07.2013