Следующие аннотации поддерживаются только при использовании в сочетании с SpringRunner, правилами для JUnit 4 в Spring или вспомогательными классами JUnit 4 в Spring:

@IfProfileValue

Аннотация @IfProfileValue указывает, что аннотированный тест активирован для определенной тестовой среды. Если сконфигурированный ProfileValueSource возвращает совпадающее value для указанного name, то тест активируется. В противном случае тест запрещен и фактически игнорируется.

Можно применять аннотацию @IfProfileValue на уровне класса, на уровне метода или на обоих уровнях. Использование аннотации @IfProfileValue на уровне класса имеет приоритет над использованием на уровне метода для любых методов внутри этого класса или его подклассов. В частности, тест считается активированным, если он активирован как на уровне класса, так и на уровне метода. Отсутствие аннотации @IfProfileValue означает, что тест активирован неявно. Это соответствует семантике аннотации @Ignore из JUnit 4, за исключением того, что наличие аннотации @Ignore всегда дезактивирует тест.

В следующем примере показан тест с аннотацией @IfProfileValue:

Java
@IfProfileValue(name="java.vendor", value="Oracle Corporation") 
@Test
public void testProcessWhichRunsOnlyOnOracleJvm() {
    // некоторая логика, которая должна выполняться только на Java VM от Oracle Corporation
}
  1. Выполняем этот тест только в том случае, если поставщиком Java является "Oracle Corporation".
Kotlin
@IfProfileValue(name="java.vendor", value="Oracle Corporation") 
@Test
fun testProcessWhichRunsOnlyOnOracleJvm() {
    // некоторая логика, которая должна выполняться только на Java VM от Oracle Corporation
}
  1. Выполняем этот тест только в том случае, если поставщиком Java является "Oracle Corporation".

Как вариант, можно сконфигурировать аннотацию @IfProfileValue с использованием списка values (с семантикой OR ) для получение TestNG-подобной поддержки групп тестов в среде JUnit 4. Рассмотрим следующий пример:

Java
@IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"}) 
@Test
public void testProcessWhichRunsForUnitOrIntegrationTestGroups() {
    // некоторая логика, которая должна выполняться только для групп модульных и интеграционных тестов
}
  1. Выполняем этот тест для модульных и интеграционных тестов.
Kotlin
@IfProfileValue(name="test-groups", values=["unit-tests", "integration-tests"]) 
@Test
fun testProcessWhichRunsForUnitOrIntegrationTestGroups() {
    // некоторая логика, которая должна выполняться только для групп модульных и интеграционных тестов
}
  1. Выполняем этот тест для модульных и интеграционных тестов.

@ProfileValueSourceConfiguration

@ProfileValueSourceConfiguration – это аннотация на уровне класса, которая определяет, какой тип ProfileValueSource использовать при получении значений профиля, сконфигурированных с помощью аннотации @IfProfileValue. Если аннотация @ProfileValueSourceConfiguration не объявлена для теста, то по умолчанию используется SystemProfileValueSource. В следующем примере показано, как использовать аннотацию @ProfileValueSourceConfiguration:

Java
@ProfileValueSourceConfiguration(CustomProfileValueSource.class) 
public class CustomProfileValueSourceTests {
    // тело класса...
}
  1. Используем источник значения специального профиля.
Kotlin
@ProfileValueSourceConfiguration(CustomProfileValueSource::class) 
class CustomProfileValueSourceTests {
    // тело класса...
}
  1. Используем источник значения специального профиля.

@Timed

Аннотация @Timed указывает, что аннотированный метод тестирования должен завершить выполнение за указанный период времени (в миллисекундах). Если время выполнения текста превышает указанный период времени, то тест завершается неудачно.

Период времени включает в себя выполнение самого метода тестирования, любые повторения теста (см. @Repeat), а также установку и разборку тестового стенда. В следующем примере показано, как её использовать:

Java
@Timed(millis = 1000) 
public void testProcessWithOneSecondTimeout() {
    // некоторая логика, выполнение которой не должно занимать более 1 секунды
}
  1. Устанавливаем период времени для теста равным одной секунде.
Kotlin
@Timed(millis = 1000) 
fun testProcessWithOneSecondTimeout() {
    // некоторая логика, выполнение которой не должно занимать более 1 секунды
}
  1. Устанавливаем период времени для теста равным одной секунде.

Аннотация @Timed из Spring имеет иную семантику, чем та, что представлена в средствах поддержки аннотации @Test(timeout=…) из JUnit 4. В частности, из-за того, как JUnit 4 обрабатывает значения времени ожидания (timeouts) выполнения теста (т. е. выполняя тестовый метод в отдельном Thread), @Test(timeout=…) в упреждающем режиме не проходит тест, если тест занимает слишком много времени. С другой стороны аннотация @Timed в Spring не проваливает тест упреждающе, ждет завершения теста, прежде чем он будет пройден неудачно.

@Repeat

Аннотация @Repeat указывает, что аннотированный тестовый метод должен выполняться многократно. Количество запусков тестового метода указывается в аннотации.

Область видимости повторного выполнения включает выполнение самого тестового метода, а также установку и разбор тестового стенда. При использовании с SpringMethodRule область видимости дополнительно включает подготовку тестового экземпляра реализацией TestExecutionListener. В следующем примере показано, как использовать аннотацию @Repeat:

Java
@Repeat(10) 
@Test
public void testProcessRepeatedly() {
    // ...
}
  1. Повторяем этот тест десять раз.
Kotlin
@Repeat(10) 
@Test
fun testProcessRepeatedly() {
    // ...
}
  1. Повторяем этот тест десять раз.