2013-11-30 3 views
238

Что главное различие между@Before, @BeforeClass, @BeforeEach и @BeforeAll

  • @Before и @BeforeClass
    • и в JUnit 5 @BeforeEach и @BeforeAll
  • @After и @AfterClass

Согласно JUnit Api@Before используется в следующих случаях:

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

Принимая во внимание, что @BeforeClass может использоваться для установления соединения с базой данных. Но не мог @Before сделать то же самое?

ответ

363

Код, обозначенный @Before, выполнен перед каждым тестом, а @BeforeClass работает один раз перед всем испытательным прибором. Если ваш тестовый класс имеет десять тестов, код @Before будет выполняться десять раз, но @BeforeClass будет выполнен только один раз.

В общем, вы используете @BeforeClass, когда несколько тестов должны совместно использовать один и тот же вычислительный дорогой код установки. Установление соединения с базой данных относится к этой категории. Вы можете переместить код с @BeforeClass в @Before, но ваш тестовый прогон может занять больше времени. Обратите внимание, что код с пометкой @BeforeClass запускается как статический инициализатор, поэтому он запускается до создания экземпляра класса вашего тестового устройства.

В JUnit 5, теги @BeforeEach и @BeforeAll являются эквивалентами @Before и @BeforeClass в JUnit 4. Их имена немного более показательны, когда они бегут, свободно интерпретированные: «перед каждыми тестами» и «один раз, прежде чем все испытания» ,

+2

Ах, теперь пример с соединением DB имеет смысл. Спасибо! – user1170330

+5

@pacoverflow '@ BeforeClas' является статическим. Он запускается до создания экземпляров тестового класса. – dasblinkenlight

+0

Имейте в виду, что при использовании @BeforeClass ваш метод/параметр должен быть статическим – tiagocarvalho92

33

Разница между каждыми аннотациями являются:

+-------------------------------------------------------------------------------------------------------+ 
¦          Feature       ¦ Junit 4 ¦ Junit 5 ¦ 
¦--------------------------------------------------------------------------+--------------+-------------¦ 
¦ Execute before all test methods of the class are executed.    ¦ @BeforeClass ¦ @BeforeAll ¦ 
¦ Used with static method.             ¦    ¦    ¦ 
¦ For example, This method could contain some initialization code   ¦    ¦    ¦ 
¦-------------------------------------------------------------------------------------------------------¦ 
¦ Execute after all test methods in the current class.      ¦ @AfterClass ¦ @AfterAll ¦ 
¦ Used with static method.             ¦    ¦    ¦ 
¦ For example, This method could contain some cleanup code.    ¦    ¦    ¦ 
¦-------------------------------------------------------------------------------------------------------¦ 
¦ Execute before each test method.           ¦ @Before  ¦ @BeforeEach ¦ 
¦ Used with non-static method.            ¦    ¦    ¦ 
¦ For example, to reinitialize some class attributes used by the methods. ¦    ¦    ¦ 
¦-------------------------------------------------------------------------------------------------------¦ 
¦ Execute after each test method.           ¦ @After  ¦ @AfterEach ¦ 
¦ Used with non-static method.            ¦    ¦    ¦ 
¦ For example, to roll back database modifications.      ¦    ¦    ¦ 
+-------------------------------------------------------------------------------------------------------+ 

Большинства аннотаций в обеих версиях одинаковы, но немного отличается.

Reference

Порядок выполнения.

Dashed box -> дополнительная аннотация.

enter image description here

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