2014-11-13 2 views
1

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

Возможно ли это, или мне нужно будет сделать отдельный тестовый файл для этого?

+0

Почему бы просто не вызвать метод, который был аннотирован с помощью @Before в начале вашего теста? – Squeazer

+1

'@ Before' запускается до каждого отдельного теста. Каждый тест выполняется изолированно. Я считаю, что есть способ иметь функцию, называемую один раз, прежде чем запускать какие-либо тесты, но через аннотацию '@ BeforeClass'. – thatidiotguy

ответ

0

Запомните важный принцип Junit Testing: КАЖДЫЙ ЕДИНЫЙ ИСПЫТАНИЕ НЕЗАВИСИМО ОТ ДРУГОГО.. Это означает, что не имеет значения, какие тесты вы выполняете в другом порядке, они всегда должны проходить.

А что здесь делать?

Если у вас есть метод @Before, который заполняет список массива, а затем объявить этот список массива вне метода, как это:

private List<String> myList = new ArrayList<String>(); 

@Before 
public void myMethod(){ 
// do something, fill your list, etc. 
} 

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

@Test 
public void myTest() { 
List<String> myCopyList = new ArrayList<String>(myList); 
//work with your copy 
} 

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

Cheers

1

Возможно, проблема заключается в том, что вы заполняете список в @Before, но не создаете новый экземпляр.

** Неправильный способ **

private List<String> value = new ArrayList<String>(); 

@Before 
public void setup(){ 
    // add stuff to list 
} 

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

** Правильный способ **

private List<String> value; 

@Before 
public void setup(){ 
    value = new ArrayList<String>(); 
    // add stuff to list 
    // or you could clean the list then populate 
} 

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