Одна из причин, по которой весна описана как удобная для тестирования, потому что может быть легко просто или макет в модульном тесте.
В качестве альтернативы мы использовали следующие настройки с большим успехом, и я думаю, что это очень близко к тому, что вы хотите, я бы сильно рекомендую:
Для всех бобов, которые требуют различных реализаций в различных контекстах, переключитесь на проводку на основе аннотации. Вы можете оставить остальных как есть.
Реализовать следующий набор аннотаций
<context:component-scan base-package="com.foobar">
<context:include-filter type="annotation" expression="com.foobar.annotations.StubRepository"/>
<context:include-filter type="annotation" expression="com.foobar.annotations.TestScopedComponent"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
Тогда вы аннотировать живых реализаций с @Repository, ваш окурок реализаций с @StubRepository, любой код, который должен присутствовать в единичном-испытательном стенде ТОЛЬКО с @TestScopedComponent. Вам может понадобиться еще несколько аннотаций, но это отличный старт.
Если у вас много spring.xml, вам, вероятно, нужно будет создать несколько новых весенних xml-файлов, которые в основном содержат только определения сканирования компонентов. Обычно вы просто добавляете эти файлы в свой обычный список @ContextConfiguration. Причина этого заключается в том, что вы часто оказываетесь в разных конфигурациях контекстных сканирований (поверьте мне, вы : сделаете хотя бы еще 1 аннотацию, если вы делаете веб-тесты, что делает 4 соответствующие комбинации)
Тогда вы в основном использовать
@ContextConfiguration(locations = { "classpath:/path/to/root-config.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
Обратите внимание, что эта установка делает не позволяют иметь чередующиеся комбинации окурка/данных в реальном времени. Мы попробовали это, и я думаю, что это привело к беспорядку, который я бы никому не рекомендовал;) Мы либо проводим полный набор заглушек, либо полный набор живых сервисов.
Мы в основном используем зависящие от автозапуска зависимости при тестировании gui около того, где зависимости обычно довольно существенны. В более чистых областях кода мы используем более регулярное модульное тестирование.
В нашей системе мы имеем следующие XML-файлы для компонентов сканирования:
- для регулярного веб-производства
- для запуска веб-заглушками только
- для интеграции тестов (в JUnit)
- для модульных тестов (в JUnit)
- для веб-тестов селена (в JUnit)
Это означает, что у нас есть 5 различных системных конфигураций, с которыми мы можем начать приложение. Поскольку мы используем только аннотации, весна достаточно быстра, чтобы автоувеличивать даже те модульные тесты, которые мы хотим подключить. Я знаю, что это нетрадиционно, но это действительно здорово.
Out интеграции тестов работать с полной живой установкой, и один или два раза я решил получить действительно прагматичен и хочет иметь 5 живые токопроводящие и один макет:
public class HybridTest {
@Autowired
MyTestSubject myTestSubject;
@Test
public void testWith5LiveServicesAndOneMock(){
MyServiceLive service = myTestSubject.getMyService();
try {
MyService mock = EasyMock.create(...)
myTestSubject.setMyService(mock);
.. do funky test with lots of live but one mock object
} finally {
myTestSubject.setMyService(service);
}
}
}
Я знаю, что тест пуристы будут для меня все это. Но иногда это просто очень прагматичное решение, которое оказывается очень элегантным, когда альтернатива будет действительно действительно уродливой. Опять же, это обычно в тех близлежащих районах.
Весна делает модульное тестирование мертвым простым. Это та часть, которую вам не хватает - вы проводите интеграционный тест, а не Unit Test. В истинном модульном тесте любые зависимые компоненты должны быть mocks, потому что вы проверяете только единицу, а не всю систему. – bpapa
Как выполнить * единичный тест * весеннее приложение: http://confessionsofanagilecoach.blogspot.com/2016/05/unit-testing-spring-applications.html –