Автоматическое создание экземпляра в тесте Spring JUnit

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

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

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>

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

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

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

Ответы

Ответ 1

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

Ответ 2

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