Интеграционное тестирование в Spring: аннотации тестирования Spring JUnit Jupiter

Следующие аннотации поддерживаются только при использовании вместе с SpringExtension и JUnit Jupiter (то есть моделью программирования в JUnit 5):

  • @SpringJUnitConfig
  • @SpringJUnitWebConfig
  • @TestConstructor
  • @EnabledIf
  • @DisabledIf

@SpringJUnitConfig

@SpringJUnitConfig - это составная аннотация, которая объединяет @ExtendWith(SpringExtension.class) из JUnit Jupiter с @ContextConfiguration из Spring TestContext Framework. Его можно использовать на уровне класса как замену @ContextConfiguration. Что касается параметров конфигурации, единственное различие между @ContextConfiguration и @SpringJUnitConfig состоит в том, что классы компонентов могут быть объявлены с атрибутом value в @SpringJUnitConfig.

В следующем примере показано, как использовать аннотацию @SpringJUnitConfig для указания класса конфигурации:

// Указываем класс конфигурации.
@SpringJUnitConfig(TestConfig.class) 
class ConfigurationClassJUnitJupiterSpringTests {
    // тело класса...
}

В следующем примере показано, как использовать аннотацию @SpringJUnitConfig для указания местоположения файла конфигурации:

// Указываем расположение файла конфигурации.
@SpringJUnitConfig(locations = "/test-config.xml") 
class XmlJUnitJupiterSpringTests {
    // тело класса...
}

@SpringJUnitWebConfig

@SpringJUnitWebConfig - это составная аннотация, которая объединяет @ExtendWith(SpringExtension.class) из JUnit Jupiter с @ContextConfiguration и @WebAppConfiguration из Spring TestContext Framework. Вы можете использовать его на уровне класса как замену @ContextConfiguration и @WebAppConfiguration. Что касается параметров конфигурации, единственное различие между @ContextConfiguration и @SpringJUnitWebConfig состоит в том, что вы можете объявлять классы компонентов, используя атрибут value в @SpringJUnitWebConfig. Кроме того, вы можете переопределить атрибут value из @WebAppConfiguration только с помощью атрибута resourcePath в @SpringJUnitWebConfig.

В следующем примере показано, как использовать аннотацию @SpringJUnitWebConfig для указания класса конфигурации:

@SpringJUnitWebConfig(TestConfig.class) 
class ConfigurationClassJUnitJupiterSpringWebTests {
    // тело класса...
}

В следующем примере показано, как использовать аннотацию @SpringJUnitWebConfig для указания местоположения файла конфигурации:

@SpringJUnitWebConfig(locations = "/test-config.xml") 
class XmlJUnitJupiterSpringWebTests {
    // тело класса...
}

@TestConstructor

@TestConstructor - это аннотация уровня типа, которая используется для настройки того, как параметры конструктора тестового класса автоматически подключаются к компонентам в ApplicationContext теста.

Если @TestConstructor отсутствует или мета-присутствует в тестовом классе, будет использоваться режим autowire конструктора тестов по умолчанию. Локальное объявление @Autowired в конструкторе имеет приоритет как над @TestConstructor, так и над режимом по умолчанию.

Изменение режима autowire конструктора тестов по умолчанию

Режим autowire конструктора тестов по умолчанию можно изменить, установив для системного свойства JVM spring.test.constructor.autowire.mode значение all. Кроме того, режим по умолчанию можно изменить с помощью механизма SpringProperties.

Если свойство spring.test.constructor.autowire.mode не задано, конструкторы тестовых классов не будут автоматически подключаться.

Начиная с Spring Framework 5.2, @TestConstructor поддерживается только вместе с SpringExtension для использования с JUnit Jupiter. Обратите внимание, что SpringExtension часто автоматически регистрируется для вас - например, при использовании таких аннотаций, как @SpringJUnitConfig и @SpringJUnitWebConfig, или различных связанных с тестами аннотаций из Spring Boot Test.

@EnabledIf

@EnabledIf используется, чтобы сигнализировать, что аннотированный тестовый класс JUnit Jupiter или тестовый метод включен и должен быть запущен, если предоставленное выражение оценивается как истинное. В частности, если выражение оценивается как Boolean.TRUE или String, равное true (без учета регистра), проверка включается. При применении на уровне класса все методы тестирования в этом классе также автоматически включаются по умолчанию.

Выражения могут быть любыми из следующих:

  • Выражение Spring Expression Language (SpEL). Например: @EnabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")
  • Заполнитель для свойства, доступного в среде Spring. Например: @EnabledIf("${smoke.tests.enabled}")
  • Текстовый литерал. Например: @EnabledIf("true")

Однако обратите внимание, что текстовый литерал, который не является результатом динамического разрешения заполнителя свойства, имеет нулевое практическое значение, поскольку @EnabledIf("false") эквивалентно @Disabled, а @EnabledIf("true") логически бессмысленно.

Вы можете использовать @EnabledIf в качестве метааннотации для создания настраиваемых составных аннотаций. Например, вы можете создать собственную аннотацию @EnabledOnMac следующим образом:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@EnabledIf(
    expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
    reason = "Enabled on Mac OS"
)
public @interface EnabledOnMac {}

@DisabledIf

@DisabledIf используется, чтобы сигнализировать, что аннотированный тестовый класс JUnit Jupiter или тестовый метод отключены и не должны запускаться, если предоставленное выражение оценивается как истинное. В частности, если выражение оценивается как Boolean.TRUE или String, равное true (без учета регистра), проверка отключается. При применении на уровне класса все методы тестирования в этом классе также автоматически отключаются.

Выражения могут быть любыми из следующих:

  • Выражение Spring Expression Language (SpEL). Например: @DisabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")
  • Заполнитель для свойства, доступного в среде Spring. Например: @DisabledIf("${smoke.tests.disabled}")
  • Текстовый литерал. Например: @DisabledIf("true")

Обратите внимание, однако, что текстовый литерал, который не является результатом динамического разрешения заполнителя свойства, имеет нулевое практическое значение, поскольку @DisabledIf("true") эквивалентно @Disabled, а @DisabledIf("false") логически бессмысленно.

Вы можете использовать @DisabledIf в качестве метааннотации для создания пользовательских составных аннотаций. Например, вы можете создать собственную аннотацию @DisabledOnMac следующим образом:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@DisabledIf(
    expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
    reason = "Disabled on Mac OS"
)
public @interface DisabledOnMac {}


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки