Автоматическое создание макета в тесте Spring JUnit

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

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

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>

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

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

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


person nd.    schedule 20.04.2012    source источник
comment
Вы пробовали аннотацию Mockito @InjectMocks? В чем это не соответствует вашим требованиям?   -  person Dawood ibn Kareem    schedule 23.04.2012
comment
@DavidWallace @InjectMocks очень хорошо работает для модульных тестов, то есть для тестирования одного конкретного класса, в котором тест использует имитированные объекты. Однако я хотел бы издеваться над всеми объектами, на которые есть ссылки в определении bean-компонента Spring. Это означает, что мне нужно заполнить контекст приложения Spring моками (возможно, с именем) - я не знаю, как @InjectMocks помогает в этом.   -  person nd.    schedule 23.04.2012
comment
Хорошо, я подумаю об этом еще.   -  person Dawood ibn Kareem    schedule 23.04.2012


Ответы (2)


Вот короткая статья с примером кода. Реализация BeanDefinitionRegistryPostProcessor создает фиктивный объект для каждого отсутствующего определения bean-компонента. Часть генерации выполняется с помощью MocksFactory, вот пример такой фабрики.

person Yves Martin    schedule 24.04.2012
comment
Этот ответ был правильной отправной точкой для решения проблемы: использование BeanDefinitionRegistryPostProcessor позволяет проанализировать определения bean-компонентов для отсутствующих bean-компонентов. Я расширил пример кода, чтобы также позаботиться о bean-компонентах, которые внедряются с помощью сеттеров, но такое расширение довольно тривиально. - person nd.; 24.04.2012
comment
Вторая ссылка мертва. РВАТЬ. старая статья - person usr-local-ΕΨΗΕΛΩΝ; 21.07.2017

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

person Ruben    schedule 13.10.2014