Junit-запустить метод настройки один раз



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

505   7  

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

    Ничего не найдено.