Перейти к основному содержимому

Регистрация программного расширения JUnit5 с помощью @RegisterExtension

· 3 мин. чтения

1. Обзор

JUnit 5 предоставляет несколько методов регистрации расширений. Обзор некоторых из этих методов см. в нашем Руководстве по расширениям JUnit 5 .

В этом кратком руководстве мы сосредоточимся на программной регистрации расширений JUnit 5 с использованием аннотации @RegisterExtension .

2. @RegisterExtension

Мы можем применить эту аннотацию к полям в тестовых классах. Одним из преимуществ этого метода является то, что мы можем напрямую обращаться к расширению как к объекту в тестовом контенте.

JUnit будет вызывать методы расширения на соответствующих этапах.

Например, если расширение реализует BeforeEachCallback, JUnit вызовет соответствующие методы интерфейса перед выполнением тестового метода.

3. Использование @RegisterExtension со статическими полями

При использовании со статическими полями JUnit будет применять методы этого расширения после применения расширений на основе @ExtendWith на уровне класса .

Кроме того, JUnit будет вызывать обратные вызовы расширения как на уровне класса, так и на уровне метода.

Например, в следующем расширении представлены реализации как beforeAll , так и beforeEach :

public class LoggingExtension implements 
BeforeAllCallback, BeforeEachCallback {

// logger, constructor etc

@Override
public void beforeAll(ExtensionContext extensionContext)
throws Exception {
logger.info("Type {} In beforeAll : {}",
type, extensionContext.getDisplayName());
}

@Override
public void beforeEach(ExtensionContext extensionContext) throws Exception {
logger.info("Type {} In beforeEach : {}",
type, extensionContext.getDisplayName());
}

public String getType() {
return type;
}
}

Давайте применим это расширение к статическому полю теста:

public class RegisterExtensionTest {

@RegisterExtension
static LoggingExtension staticExtension = new LoggingExtension("static version");

@Test
public void demoTest() {
// assertions
}
}

В выходных данных отображаются сообщения как от методов beforeAll , так и от методов beforeEach :

Type static version In beforeAll : RegisterExtensionTest
Type static version In beforeEach : demoTest()

4. Использование @RegisterExtension с полями экземпляра

Если мы используем RegisterExtension с нестатическими полями, JUnit применит расширение только после обработки всех обратных вызовов TestInstancePostProcessor .

В этом случае JUnit будет игнорировать обратные вызовы уровня класса, такие как beforeAll .

В приведенном выше примере давайте удалим модификатор static из LoggingExtension :

@RegisterExtension
LoggingExtension instanceLevelExtension = new LoggingExtension("instance version");

Теперь JUnit будет вызывать только метод beforeEach , как показано в выводе:

Type instance version In beforeEach : demoTest()

5. Вывод

В этой статье мы сделали обзор программной регистрации расширений JUnit 5 с помощью @RegisterExtension .

Мы также рассмотрели разницу между применением расширения к статическим полям и полям экземпляра.

Как обычно, примеры кода можно найти в нашем репозитории на Github .