7 ответов:
хотя я согласен с @assylias, что с помощью
@BeforeClassЭто классическое решение не всегда удобно. Метод с аннотацией@BeforeClassдолжно быть статическим. Это очень неудобно для некоторых тестов, которые нуждаются в экземпляре тестового случая. Например, тесты на основе Spring, которые используют@Autowiredдля работы с сервисами, определенными в контексте spring.в этом случае я лично использую обычный
setUp()метод с аннотацией@Beforeаннотации и управление мои пользовательскиеbooleanфлаг:private static boolean setUpIsDone = false; ..... public void setUp() { if (setUpIsDone) { return; } // do the setup setUpIsDone = true; }
можно использовать the
BeforeClassаннотации:@BeforeClass public static void setUpClass() { //executed only once, before the first test }
JUnit 5 теперь имеет аннотацию @BeforeAll:
обозначает, что аннотированный метод должен быть выполнен до всех @Test методы в текущем классе или иерархии классов; аналогично JUnit 4's @BeforeClass. Такие методы должны быть статическими.
аннотации жизненного цикла JUnit 5, похоже, наконец-то получили это право! Вы можете догадаться, какие аннотации доступны, даже не глядя (например, @BeforeEach @AfterAll)
, когда
setUp()находится в суперклассе тестового класса, принятый ответ может быть изменен следующим образом:public abstract class AbstractTestBase { private static Class<? extends AbstractTestBase> testClass; ..... public void setUp() { if (this.getClass().equals(testClass)) { return; } // do the setup - once per concrete test class ..... testClass = this.getClass(); } }это должно работать для одного нестатические
setUp()метод, но я не могу создать эквивалент дляtearDown()не забредая в мир сложного отражения... Баунти указывает на всех, кто может!
Edit: Я только что узнал во время отладки, что класс создается перед каждым тестом тоже. Я думаю, что аннотация @BeforeClass является лучшей здесь.
вы можете настроить на конструкторе тоже тестовый класс и класс, В конце концов. Я не уверен, что это плохая практика, потому что почти все другие методы аннотированы, но это работает. Вы можете создать такой конструктор:
public UT () { // initialize once here } @Test // Some test here...конструктор будет вызван перед тесты, потому что они не статичны.
мое грязное решение:
public class TestCaseExtended extends TestCase { private boolean isInitialized = false; private int serId; @Override public void setUp() throws Exception { super.setUp(); if(!isInitialized) { loadSaveNewSerId(); emptyTestResultsDirectory(); isInitialized = true; } } ... }Я использую его в качестве базового для всех моих тестов.
попробуйте это решение: https://stackoverflow.com/a/46274919/907576 :
С
@BeforeAllMethods/@AfterAllMethodsаннотация вы можете выполнить любой метод в тестовом классе в контексте экземпляра, где доступны все введенные значения.
Comments