2017-02-09 5 views
0

Мой тестовый код Junit выглядит следующим образом.Ручное автообучение фасолей не работает в тесте JUnit

private static boolean setupDone = false; 
private Box box; 

@Before 
public void setup(){ 

    if (setupDone){ 
    return true; 
    } 

    box = new BoxCreator(this.applicationContext); 

    applicationContext.getAutowireCapableBeanFactory().autowireBean(box); 

    setupDone = true; 
} 

@Test 
public void Test1(){ 
    String response = box.getBoxResponse(); 

    ...asserts go here as usual.... 
} 

@Test 
public void Test2(){ 
String response = box.getBoxResponse(); 

...asserts go here as usual.... 
} 

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

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

Теперь проблема заключается в том, что, какой бы метод проверки не выполнялся, сначала получает значение объекта box, а второй метод проверки видит в поле как null. Не уверен, почему он становится нулевым, когда выполняется второй метод тестирования.

ответ

0

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

Если вы сделаете «коробку» статической, она может работать лучше. Обратите внимание, что «setupDone» и «box» инициализируются в методе @Before вместе и должны находиться в том же месте, независимо от того, является ли класс для статики или экземпляра только для глобальных переменных.

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

+0

Значит, вы хотите сказать, что разные тесты в одном классе тестов будут иметь разные прикладные контексты? – Hary

+0

Каждый тест имеет разные «это» и все его переменные экземпляра. Статические переменные остаются с классом и одинаковы независимо от того, какой экземпляр «этого». –

0

Как отметил Ли Мидор, JUnit создает новый экземпляр тестового класса перед вызовом каждого метода @Test. Делая это, он обеспечивает независимость между методами тестирования и избегает непреднамеренных побочных эффектов в тестовом коде. Каждый тест должен быть индивидуально выполнен без какого-либо эффекта предыдущего теста и, следовательно, должен иметь разные контексты приложения в вашем случае.

+0

И как работает контекст приложения или фабрика бобов в тестах JUnit? У каждого теста будет свой собственный экземпляр тестового класса и отдельный контекст приложения или фабрика фасоли? Так оно работает? – Hary

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