Arhn - архитектура программирования

Что это делает: @RunWith(SpringJUnit4ClassRunner.class)

Что делает эта аннотация?
Когда мне следует ее использовать?
Когда я не хочу ее использовать?

@RunWith(SpringJUnit4ClassRunner.class)

Я могу найти больше вариантов использования этого, когда я Google и не нахожу объяснения 101 относительно того, что эта аннотация должна сообщать мне или когда/почему я буду ее использовать?

14.08.2014

Ответы:


1

Аннотация используется для настройки модульного теста, требующего внедрения зависимостей Spring.

Из Справочник по Spring — 10. Модульное тестирование:

10.1 Создание класса модульного теста

Чтобы модульный тест запускал пакетное задание, платформа должна загрузить ApplicationContext задания. Для этого используются две аннотации:

@RunWith(SpringJUnit4ClassRunner.class): указывает, что класс должен использовать средства Spring JUnit.

@ContextConfiguration(locations = {...}): указывает, какие файлы XML содержат ApplicationContext.

14.08.2014

2

Если вы используете аннотации, а не XML-файлы, то любой класс, который вы тестируете, который требует внедрения зависимости Spring, должен быть помещен в аннотацию @ContextConfiguration. Например:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FooManager.class)
class FooManagerTest {
    
    @Autowired
    FooManager fooManager;

Теперь, когда вы используете fooManager в модульном тесте, для него будет настроен контекст Spring.

Если fooManager автоматически подключается к каким-либо bean-компонентам, то классы этих bean-компонентов также должны быть в аннотации @ContextConfiguration. Итак, если fooManager автоматически подключается к FooReporter bean-компоненту:

@ContextConfiguration(classes = {FooManager.class, FooReporter.class})

Если bean-компоненты, в которых fooManager автоматически подключается, содержат состояние, то вы, вероятно, захотите сбросить состояние этих bean-компонентов для каждого теста. В этом случае вы можете добавить аннотацию @DirtiesContext к своему тестовому классу:

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)

Если fooManager или любой из его автосвязанных bean-компонентов читает конфигурацию Spring, вам нужно добавить список initializers в аннотацию @ContextConfiguration, которая содержит класс ConfigFileApplicationContextInitializer:

@ContextConfiguration(classes = {FooManager.class, FooReporter.class}, initializers = ConfigFileApplicationContextInitializer.class)
19.11.2018

3

Чтобы ответить на то, когда вы хотели бы и не хотели бы использовать его, часть вопроса.

Когда использовать SpringJUnit4ClassRunner

IMO SpringJUnit4ClassRunner следует использовать очень экономно. Существуют значительные накладные расходы, связанные с запуском контейнера Spring для запуска модульного теста.

Обычно я использую SpringJUnit4ClassRunner для тестирования:

  • что компоненты вводятся (автоматически подключаются), как и ожидалось
  • что данные конфигурации вводятся, как и ожидалось

При внедрении компонентов могут возникнуть проблемы, например, если аннотация @Qualifier не используется или используется неправильно.

При загрузке конфигурации из нескольких файлов yaml вы можете проверить, что карты объединяются, как и ожидалось, с соответствующими переопределениями.

По крайней мере, у меня всегда есть простой тест SpringJUnit4ClassRunner для проверки правильности запуска контейнера Spring.

Когда не использовать SpringJUnit4ClassRunner

Я бы не стал использовать SpringJUnit4ClassRunner для тестирования функций, не связанных с Spring, в моем тестируемом коде. Что, по моему опыту, означает большую часть функциональности.

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

Я делаю насмешки простыми и использую Spock для имитации компонентов. Пример заводного кода:

import spock.lang.Specification

class FooManagerTest extends Specification {

  FooManager cut

  void createMockFooReporter() {
    FooReporter mockFooReporter = Mock(FooReporter)
    mockFooReporter.fooFormatter = Mock(FooFormatter)
  }

  void setup() {
    cut = new FooManager()
    cut.fooReporter = createMockFooReporter()
  }

  void "Basic test"() {
     // Do a basic test using 'cut'
  }

}

В этом примере тестируемый класс FooManager имеет автосвязывание FooReporter, которое само содержит автосвязывание FooFormatter.

20.08.2019

4

Я думаю, что аннотация @RunWith предназначена для инициализации контекста spring. Поскольку junit5 выпущен, вы можете просто заменить его на @SpringJUnitConfig. Кстати, аннотация @RunWith уже заменена на @ExtendWith, но вы все еще можете ее использовать.

12.01.2021
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..