Переопределение бобов Spring в среде модульных тестов - PullRequest
50 голосов
/ 19 февраля 2009

мы используем Spring для моих приложений и Spring Testing Framework для модульных тестов. Однако у нас есть небольшая проблема: код приложения загружает контекст приложения Spring из списка местоположений (XML-файлов) в пути к классам. Но когда мы запускаем наши модульные тесты, мы хотим, чтобы некоторые компоненты Spring были фиктивными, а не полноценными классами реализации. Более того, для некоторых модульных тестов мы хотим, чтобы некоторые bean-компоненты становились фиктивными, в то время как для других модульных тестов мы хотим, чтобы другие bean-компоненты становились фиктивными, поскольку мы тестируем разные уровни приложения.

Все это означает, что я хочу переопределить определенные bean-компоненты контекста приложения и обновить контекст при желании. При этом я хочу переопределить только небольшую часть bean-компонентов, расположенных в одном (или нескольких) оригинальном файле определения bean-компонентов xml. Я не могу найти легкий способ сделать это. Всегда считалось, что Spring - дружественная среда для модульного тестирования, поэтому я должен что-то здесь упустить.

У вас есть идеи, как это сделать?

Спасибо.

Ответы [ 13 ]

0 голосов
/ 02 февраля 2014

репринтинг пружинный предназначен для замены бобов насмешками.

0 голосов
/ 10 июня 2009

Я хочу сделать то же самое, и мы находим это необходимым.

Текущий механизм, который мы используем, довольно ручной, но он работает.

Скажем, к примеру, вы хотите смоделировать bean-компонент типа Y. То, что мы делаем, - это каждый bean-компонент, имеющий эту зависимость, которую мы создаем для реализации интерфейса - "IHasY". Этот интерфейс

interface IHasY {
   public void setY(Y y);
}

Затем в нашем тесте мы вызываем метод util ...

 public static void insertMock(Y y) {
        Map invokers = BeanFactory.getInstance().getFactory("core").getBeansOfType(IHasY.class);
        for (Iterator iterator = invokers.values().iterator(); iterator.hasNext();) {
            IHasY invoker = (IHasY) iterator.next();
            invoker.setY(y);
        }
    }

Я не хочу создавать целый XML-файл просто для внедрения этой новой зависимости, и именно поэтому мне это нравится.

Если вы хотите создать конфигурационный файл xml, то вам нужно будет создать новую фабрику с фиктивными компонентами и сделать фабрику по умолчанию родителем этой фабрики. Затем убедитесь, что вы загружаете все ваши бины из новой дочерней фабрики. При этом суб-фабрика переопределит bean-компоненты в родительской фабрике, когда идентификаторы bean-идентификаторов совпадают.

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

0 голосов
/ 19 февраля 2009

Возможно, вы могли бы использовать квалификаторы для ваших бобов? Вы бы переопределили бины, которые хотите макетировать, в отдельном контексте приложения и пометили бы их квалификатором «test». В ваших модульных тестах при подключении бобов всегда указывайте квалификатор «test» для использования макетов.

...