2012-04-20 7 views
11

У меня есть определение XML-компонента Spring, для которого я хочу написать тесты интеграции. Определение XML-компонента является частью более широкого контекста приложения, в котором несколько таких файлов включены с использованием <import>. Внутри определения я ссылаюсь на несколько компонентов, которые поступают из других файлов.Автоматическое создание экземпляра в тесте Spring JUnit

Для моего теста интеграции я хотел бы создать экземпляр отдельного определения и использовать Mockito mocks для всех других компонентов. До сих пор, я не буду использовать что-то вроде этого:

FooIntegrationTest.java

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class FooIntegrationTest { 
    @Autowired private ClassUnderTest underTest; 
    @Autowired private MockedClass mock; 

    @Test 
    public void testFoo() { 
    } 
} 

FooIntegrationTest-context.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
    <import resource="part-to-test.xml" /> 

    <bean id="mockedClassReferencedByName" class="org.mockito.Mockito" factory-method="mock" c:classToMock="SomeMockedClass" /> 
    <bean class="org.mockito.Mockito" factory-method="mock" c:classToMock="OtherMockedClassReferencedByType" /> 
    <bean class="org.mockito.Mockito" factory-method="mock" c:classToMock="MockedClass" /> 
    ... 
</beans> 

Я хотел бы автоматизировать раздел довольно утомительной насмешливый : В идеале, я бы хотел, чтобы все компоненты, которые не были найдены в контексте приложения, были издеваются автоматически. part-to-test.xml использует @Autowired, а также компоненты, которые устанавливаются с использованием ссылок на названия. Я использую только файлы XML bean definition, и ни один из них не использует классы @Configuration, а не @Component аннотации.

Я изучил, как использовать пользовательский загрузчик контекста в @ContextConfiguration(loader=...), но я еще не нашел подходящую точку расширения для этого. Спринокито, похоже, не рассматривает эту проблему.

Есть ли другой проект, который уже решает эту проблему? Если нет, где бы я мог продлить Spring, чтобы автоматически создавать mocks?

+0

Вы пробовали аннотацию Mockito @InjectMocks? Каким образом это не соответствует вашему требованию? –

+0

@DavidWallace '@ InjectMocks' отлично работает для модульных тестов, т. Е. Тестирует один конкретный класс, в котором тест использует издеваемые объекты. Тем не менее, я хотел бы высмеять все объекты, на которые ссылаются в определении Spring bean. Это означает, что мне нужно заполнить контекст приложения Spring (возможно, названный) mocks - я не знаю, как это помогает @ InjectMocks. –

+0

Хорошо, я подумаю об этом еще немного. –

ответ

3

Адрес short article with a code example. Реализация BeanDefinitionRegistryPostProcessor генерирует макет объекта для каждого из отсутствующих определений бобов. Часть генерации выполняется с помощью MocksFactory, здесь an example for such a factory.

+0

Этот ответ был правильной отправной точкой для решения проблемы: использование «BeanDefinitionRegistryPostProcessor» позволяет анализировать определения bean-компонентов для отсутствующих bean-компонентов. Я расширил пример кода, чтобы также позаботиться о бобах, которые вводятся с помощью сеттеров, но такое расширение довольно тривиально. –

+0

Вторая ссылка мертва. ПОКОЙСЯ С МИРОМ. старая статья –

2

Только в случае, если кто еще заинтересован в этом вопросе, я продлил код в статье упоминается Ив Мартин с наследованием, поддержка @Inject и т.д ... и создал проект GitHub здесь: https://github.com/rinoto/spring-auto-mock

Смежные вопросы