Наступні анотації підтримуються лише при використанні в поєднанні зі 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. Повторюємо цей тест десять разів.