@After ,@before не работает в тестовом примере

Я начал тестирование и теперь хочу использовать @After, @Before и @Test, но мое приложение запускает только метод @Before и выводит результат на консоль

до

Однако, если я удалю @After и @Before, он запустит @Test. Мой код здесь:

public class TestPractise extends AbstractTransactionalDataSourceSpringContextTests{

    @Before
    public void runBare(){
        System.out.println("before");
    }

    @Test
    public void testingMethod(){
        System.out.println("testing");
    }

    @After
    public void setDirty(){
        System.out.println("after");
    }
}

Почему @After, @Test и @before не работают одновременно?


person abhishek ameta    schedule 14.05.2012    source источник


Ответы (6)


Класс AbstractTransactionalDataSourceSpringContextTests заставляет использовать старый синтаксис JUnit 3.x, что означает, что любая аннотация JUnit 4 не будет работать.

Ваш метод runBare() выполняется не из-за аннотации @Before, а потому, что он называется runBare(), который является методом, предоставляемым ConditionalTestCase и JUnit TestCase.

Итак, у вас есть 2 решения:

  • Используйте ответ AlexR, чтобы использовать тесты JUnit 4 и Spring;
  • Сохраните наследство AbstractTransactionalDataSourceSpringContextTests, но используйте методы onSetUp и onTearDown вместо методов @Before и @After.
person Romain Linsolas    schedule 14.05.2012
comment
Столкнулся с той же проблемой, смешивая JUnit 4 и 5. Проверьте свой импорт на наличие аннотаций и убедитесь, что они совпадают. - person Muhd; 20.06.2017

Используйте @BeforeEach вместо @Before и @AfterEach вместо @After.

person vikram k    schedule 25.07.2018
comment
Не могли бы вы добавить небольшое объяснение о том, почему и как это решает проблему? - person anothernode; 25.07.2018
comment
В моем случае мой код @Before и @After не работал, но он работал, когда я заменил @Before на @BeforeEach и @After и @AfterEach. - person vikram k; 26.07.2018
comment
Это просто более конкретные имена, работающие одинаково. Но поддержка (выполнение) зависит от версии Junit. - person vikram k; 26.07.2018
comment
чувак! Я потратил часы, чтобы понять это! - person sschrass; 06.05.2019
comment
Просто имейте в виду, что это создает много потраченного впустую выполнения. BeforeEach сбрасывает все перед каждым запуском теста. Это может быть желательным, но ненужным, например, при загрузке файла для тестовых параметров или однократного чтения файла для класса. - person avgvstvs; 03.03.2020

Убедитесь, что вы используете Junit4, потому что, начиная с Junit5, @Before/@After теперь является @BeforeEach/@AfterEach, и аналогично @BeforeClass/@AfterClass является @AfterAll/@BeforeAll.

person Anurag Bharti    schedule 14.07.2020

Это должно работать... Но поскольку вы работаете с Spring Framework, а JUnit 4 был представлен несколько лет назад, я предлагаю вам использовать аннотации вместо наследования.

Итак, аннотируйте свой класс с помощью @RunWith(SpringJUnit4ClassRunner.class). Удалить extends AbstractTransactionalDataSourceSpringContextTests.

Не забудьте сделать методы @Before и @After статический

Теперь это должно работать.

Даже если вы хотите расширить классы абстрактных тестов Spring, по крайней мере обратите внимание, что некоторые из них устарели. Например, класс AbstractTransactionalDataSourceSpringContextTests устарел.

person AlexR    schedule 14.05.2012
comment
Не могли бы вы привести пример для @RunWith(SpringJUnit4ClassRunner.class) ?? - person abhishek ameta; 14.05.2012
comment
если вы напишете пример для AbstractTransactionalDataSourceSpringContextTests, это будет хорошо. - person abhishek ameta; 14.05.2012
comment
Извините за задержку. Пример очень простой. Просто удалите расширения... и добавьте аннотацию, которую я написал в классе. Затем попробуйте запустить тест. - person AlexR; 14.05.2012

Если вы используете автоматический импорт в IDE, убедитесь, что @Test и @Before импортированы из пакета org.junit.

person user514949    schedule 08.03.2021

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

до (не работает) @Test void validate() выдает Exception {}

после (работы) @Test public void validate() выдает Exception {}

person Mauricio Carrero    schedule 30.10.2020