Как переопределить поведение Spring @Autowired - PullRequest
8 голосов
/ 16 мая 2010

Немного фона:

Я использую Spring 2.5, в частности Spring IOC и аннотации.

Я использую @Autowired в своем коде (автопроводка выполняется по типу) и используйте @Component для выставления классов на автоматическое подключение.

Ситуация, описанная ниже, возникла при попытке проверить мой код.

Теперь к проблеме:

Примечание. Я использую другой контекст Spring для среды тестирования.

У меня есть класс FOO, который @Autowired, но в контексте теста я хочу использовать другой класс того же типа MockFoo (extends FOO).

Настройка Spring, конечно, завершается неудачей автоматически из-за нескольких опций для внедрения зависимостей класса FOOFOO, и MockFOO соответствуют проверке типа).

Я ищу способ ввести тестовый компонент вместо оригинального.

Я ожидал, что Spring разрешит использовать файл конфигурации Context для переопределения внедрения bean-компонента или запретить Spring автоматически связывать конкретный bean-компонент.

НО

Кажется, что все эти опции существуют только для bean-компонентов, которые были изначально определены в файле конфигурации контекста Spring.

Ответы [ 3 ]

6 голосов
/ 19 мая 2010

Используйте ReflectionTestUtils, чтобы вручную установить макет вместо зависимости автопровода (для этого ваш макет не должен управляться пружиной, чтобы не возникала двусмысленность)

2 голосов
/ 23 сентября 2011

Я согласен с Дидье. Вот пример того, как вы можете исключить реализации, которые вы хотите смоделировать в контексте тестового приложения.

<context:component-scan base-package="com.company" >
    <context:exclude-filter type="regex" expression="com\.abc\.service\.XDaoImpl"/>    
</context:component-scan>

Включите этот контекст приложения в свой тест следующим образом:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/applicationContext-test.xml"})
public class MyTest {....}
2 голосов
/ 13 августа 2011

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

Поскольку вы, вероятно, не хотите смешивать Foo и MockFoo в своем контексте, я бы предложил удалить Foo из сканирования компонентов. Это можно сделать, например, указав включить / исключить фильтры на <context:component-scan>.

Однако, если вы реализуете модульные тесты, я бы предпочел не использовать контекст Spring и просто реализовывать «чистые» модульные тесты, вводя макеты зависимостей вручную, так что вы тестируете только один класс. Это может быть достигнуто легче, используя насмешливую структуру как Mockito .

...