2017-02-16 20 views
0

У меня есть класс, который имеет статические и нестатические поля. Я параметризую этот класс для тестов JUnit. Теперь у меня есть сомнения, разделены ли статические поля между тестами или нет. Если @Parameterized annotation помогает только создать много экземпляров одного и того же класса, то я считаю, что статические поля распределяются между тестами, но если он создает разные классы (например, с добавлением некоторого суффикса к имени класса в фоновом режиме), то каждый класс будет иметь его собственные статические поля. я попытался проверить его с этим кодом, но без успеха:Является статическим полем класса, разделяемым между тестами, когда параметр параметризуется?

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 

import java.util.Arrays; 
import java.util.List; 

@RunWith(Parameterized.class) 
public class Parametrized { 
    public static String field1; 
    public String field2; 
    public int slp; 

    public Parametrized (String str1, String str2, int slp) { 
    this.field1 = str1; 
    this.field2 = str2; 
    this.slp = slp; 
    } 

    @Parameterized.Parameters() 
    public static List<Object[]> data() { 
    return Arrays.asList(new Object[][] {{"1_static", "1_nonstatic", 5000}, {"2_static", "2_nonstatic", 2000}}); 
    } 

    @Test 
    public void test_static() throws InterruptedException { 
    System.out.println(field1); 
    Thread.sleep(this.slp); 
    System.out.println(field2); 
    System.out.println(field1); 
    } 
} 

Во-первых, я заметил, что тесты не работают параллельно, но один за другим: я подумал, что было основной смысл использования @Parameterized - проводить тесты параллельно.

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

+0

Также неясно, как это работает, если тесты выполняются с плагином Maven SureFire - создадут ли они разные копии параметризованного класса в фоновом режиме, каждый из которых имеет свои собственные статические объекты? – user6419217

ответ

2

Добавление аннотации не влияет на работу Java. Поле static по-прежнему является статическим полем.

Это не для параллельных испытаний, поскольку они могут мешать друг другу. например общий ресурс, такой как статическое поле.

Кстати, если вы устанавливаете статическое поле в конструкторе, вы почти наверняка делаете что-то неправильно.

+0

Относительно установки статического поля в конструкторе - я сделал это специально, чтобы проверить, являются ли общие поля статическими. Вот почему я добавил спать там: я хотел установить его с первыми данными, затем изменить его со вторым набором данных, а затем проверить его значение из первого набора данных, чтобы узнать, был ли он изменен вторым набором данные. Но поскольку он запускался не параллельно, а последовательно - это не имело большого смысла. Вот почему я пришел сюда, чтобы уточнить, что происходит. – user6419217

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^