Сбой впрыска бобов из-за прокси

Весенняя версия: 3.2.4.Релиз и 3.2.9.Релиз

Версия Мокито: 1.8.5

Я пытался представить H2-тесты в старом проекте для интеграционного тестирования, и я столкнулся с несколькими проблемами. Из-за того, как транзакции распространялись, мне нужно было смоделировать класс с автопроводкой. Я делал это раньше, но сейчас у меня серьезные проблемы. При инициализации теста выдается следующее сообщение об ошибке:

org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем 'com.stuff.XMLITCase': не удалось внедрить зависимости ресурсов; вложенным исключением является org.springframework.beans.factory.BeanNotOfRequiredTypeException:Бин с именем «TheProcessor» должен иметь тип [com.stuff.XMLBatchFileProcessor], но на самом деле он имеет тип [$ Proxy118] в org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues ​​(CommonAnnotationBeanPostProcessor.java:307)

Погружаясь в это немного глубже, оказывается, что бин на самом деле является прокси. Если мы проверим AbstractBeanFactory (круглая строка 239), мы увидим прокси:

sharedInstance = {$ Proxy117 @ 7035} "com.stuff.XMLBatchFileProcessor@66c540d0" h = {org.springframework.aop.framework.JdkDynamicAopProxy@7039}

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

Настройка проекта

К сожалению, я не могу дать пример проекта для этого, но я пройдусь по моей тестовой конфигурации. У меня есть корневой класс, который я расширяю для тестов:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/spring/spring-test-context.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public abstract class AbstractIntegrationTest {
}

Это просто загружает некоторый весенний конфиг и откатывает транзакции после каждого теста.

Весенний конфиг тоже ничего странного, хотя между моим другим модулем и этим есть одно отличие. Это менеджер транзакций и фабрика сессий:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="hibernateSessionFactory"/>
</bean>

<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
...
</bean>

В моем другом модуле я использую entityManagerFactory и другой менеджер транзакций:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
...
</bean>

На самом деле класс имеет несколько полей с автопроводкой и обычную аннотацию @Service:

@Service(value = "TheProcessor")
public final class XMLBatchFileProcessor extends BatchFileProcessor implements IXMLBatchProcessor {

Наконец, фактический тест выглядит следующим образом:

public class XMLITCase extends AbstractIntegrationTest {

    @Resource(name = "TheProcessor")
    @InjectMocks
    private XMLBatchFileProcessor xmlProcessor;

    @Mock
    private ProcessHelper processHelper;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() throws Exception {
        Assert.assertNotNull(xmlProcessor);
    }

}

Если я заменю XMLBatchFileProcessor на интерфейс и автоматически соединю поле, то проблем с компиляцией не возникнет. Mockito, однако, никогда не заменяет боб с автоматическим подключением на объект, который имитируют. Если бы это было так, то я бы не стал беспокоиться о аннотациях @Resource и названии службы, что позволило бы избежать проблемы с прокси.

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

РЕДАКТИРОВАТЬ

Продолжая комментарий Сотириоса, сегодня утром я еще раз посмотрел и действительно упустил, что xmlProcessor имеет@Transactional аннотации, что означает, что класс должен быть прокси. Если я удалюfinal объявить и позволить CGLib улучшить его, тогда Mockito заменяет компонент, когдаinitMocks(this) это называется. Однако, когда вызывается метод, CGLib, похоже, заменяет все компоненты на расширенные версии Spring, перезаписывая версию Mockito.

Как правильно использовать Mockito и Spring в интеграционном тесте для класса с@Transactional аннотации?

Ответы на вопрос(1)

Ваш ответ на вопрос