Вопрос заключается вот в чём, можно ли для разных тестовых случаем сделать разную обработку AfterEach в одном классе?
можно конечно
пишете case/if else по желанию в AfterEach
переменную класса/ энам присваивается в тесте
соответственно в AfterEach будет исполняться нужный блок
топорно и не безопасно но можно
Спасибо
Можно сделать через внутренние классы, условные операторы по имени/тегу и т.п.
Ещё в 4-м Junit’е было можно через механизм @RunWith(Enclosed.class)
сделать что-то подобное с вложенными классами.
Вот тут накидал примерчик небольшой, дальше под себя можете подрихтовать:
import org.junit.jupiter.api.*;
class NestedJupiterTest {
{
System.out.println("==========================");
}
@BeforeEach
void beforeAll() {
System.out.println("real before all");
}
@BeforeEach
void setupClear(TestInfo info) {
if (info.getTags().contains("Clear")) {
System.out.println("before clear");
}
}
@BeforeEach
void setupClose(TestInfo info) {
if (info.getTags().contains("Close")) {
System.out.println("before close");
}
}
@Test
@Tag(value = "All")
@Tag(value = "Clear")
@DisplayName(value = "testClear")
void testClear(TestInfo info) {
System.out.println(">>>> " + info.getDisplayName());
}
@Test
@Tag(value = "All")
@Tag(value = "Close")
@DisplayName(value = "testClose")
void testClose(TestInfo info) {
System.out.println(">>>> " + info.getDisplayName());
}
@AfterEach
void afterTagAll(TestInfo info) {
if (info.getTags().contains("All")) {
System.out.println("after tag All");
}
}
@AfterEach
void afterAll() {
System.out.println("real after all");
}
@AfterEach
void clear(TestInfo info) {
if (info.getTags().contains("Clear")) {
System.out.println("after tag Clear");
}
}
@AfterEach
void close(TestInfo info) {
if (info.getTags().contains("Close")) {
System.out.println("after tag Close");
}
}
@Nested
class InnerClass {
@BeforeEach
void beforeInner() {
System.out.println("before Nested");
}
@Test
@Tag(value = "Nested")
@DisplayName(value = "testInner")
void testInner(TestInfo info) {
System.out.println(info.getDisplayName());
}
@AfterEach
void afterInner() {
System.out.println("after Nested");
}
}
}
В Junit5 есть расширения, как раз подходящие для такого использования.
Вот тут хорошо расписано , в параграфе 4.3 Lifecycle Callbacks
А можно как-то передавать параметры при вызове таким способом?
А чем это сильно лучше, чем определять внутри @AfterEach
?
Я вообще не очень понимаю зачем разные методы @AfterEach
для разных тестов выполнять. Самое простое решение внутренние классы - @Nested
. Они видят все поля и методы внешнего класса и имеют свои before/after методы, которые не видны снаружи и запускаются независимо для каждого внутреннего класса.
Значит я ещё не постиг всех тонкостей JUnit 5) Спасибо за информацию)