Инъекция Mockito издевается в бобе Spring - PullRequest
265 голосов
/ 16 марта 2010

Я хотел бы внедрить фиктивный объект Mockito в bean-компонент Spring (3+) для модульного тестирования с помощью JUnit. Мои зависимости bean-компонентов в настоящее время внедряются с использованием аннотации @Autowired в полях закрытых членов.

Я рассмотрел использование ReflectionTestUtils.setField, но экземпляр компонента, который я хочу внедрить, на самом деле является прокси-сервером и, следовательно, не объявляет поля закрытого члена целевого класса. Я не хочу создавать общедоступный установщик зависимости, так как тогда я буду изменять свой интерфейс исключительно для целей тестирования.

Я следовал некоторым советам , данным сообществом Spring, но макет не создается, и автоматическое подключение завершается неудачно:

<bean id="dao" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.package.Dao" />
</bean>

Ошибка, с которой я сейчас сталкиваюсь, такова:

...
Caused by: org...NoSuchBeanDefinitionException:
    No matching bean of type [com.package.Dao] found for dependency:
    expected at least 1 bean which qualifies as autowire candidate for this dependency.
    Dependency annotations: {
        @org...Autowired(required=true),
        @org...Qualifier(value=dao)
    }
at org...DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(D...y.java:901)
at org...DefaultListableBeanFactory.doResolveDependency(D...y.java:770)

Если я установлю значение constructor-arg на что-то недопустимое, при запуске контекста приложения не произойдет никаких ошибок.

Ответы [ 23 ]

0 голосов
/ 04 мая 2017

Если вы используете Controller Injection, убедитесь, что ваши локальные переменные НЕ являются "окончательными"

0 голосов
/ 27 апреля 2011

Сегодня я обнаружил, что весенний контекст, в котором я объявил перед бобами Mockito, не загружался. После перемещения ПОСЛЕ макетов контекст приложения был успешно загружен. Береги себя:)

0 голосов
/ 05 июля 2013

Для справки, все мои тесты корректно работают, просто сделав прибор лениво-инициализированным, например ::100100

<bean id="fixture"
      class="it.tidalwave.northernwind.rca.embeddedserver.impl.DefaultEmbeddedServer"
      lazy-init="true" /> <!-- To solve Mockito + Spring problems -->

<bean class="it.tidalwave.messagebus.aspect.spring.MessageBusAdapterFactory" />

<bean id="applicationMessageBus"
      class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="it.tidalwave.messagebus.MessageBus" />
</bean>

<bean class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="javax.servlet.ServletContext" />
</bean>

Полагаю, логическое обоснование - это то, что Маттиас объясняет здесь (внизу поста), что обходной путь меняет порядок объявления бинов - ленивая инициализация "своего рода" с фикстурой объявлено в конце.

...