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

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

1. обзор

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

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

2. @RegisterExtensionс

Мы можем применить эту аннотацию к полям в тестовых классах. One advantage of this method is that we can access the extension as an object in the test content directly. с

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 repository.