Просто нужен небольшой совет о том, как настроить «модульное» тестирование с JUnit4 в веб-приложении Spring 3.0.2 и Hibernate 3.2.7.
В настоящее время у нас более 500 тестов по 75+ классам.
Наши тестовые классы настроены (аннотированы) аналогично классу ниже:
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration
@Transactional
@ContextConfiguration(locations={"/location/of/SomeServiceTest-context.xml"}, inheritLocations=false)
public class SomeServiceTest extends AbstractTransactionalJUnit4SpringContextTests {
@Autowired
protected SomeService someService;
@Test
public void testSomeServiceMethod() {}
@Test
public void testAnotherServiceMethod() {}
}
Наши объекты "Сервис" снабжены аннотацией @Service ("serviceName") и имеют зависимости @Autowired (защищенные), которые могут быть другими службами или DAO (аннотированы @Repository ("daoName")).
Раньше у нас были разные контексты для большинства тестовых классов. Каждый контекст содержал только необходимые компоненты для тестов в этом классе, чтобы мы могли тестировать части приложения изолированно. Зависимости, которые не были определены в контексте, будут автоматически смоделированы с помощью созданного нами AutoBeanDeclarer, вдохновленного этой статьей о DZone: Автоматическое внедрение Mock в контекст Spring
Этот вид настройки работал нормально, когда мы запускали тестовые классы индивидуально. Когда мы попытались запустить все 500+ тестов одновременно, мы столкнулись с
java.lang.OutOfMemoryError: GC overhead limit exceeded
После некоторого копания (и профилирования) мы обнаружили, что произошла утечка памяти, как объясняется в этом посте: Утечка памяти в приложении ClassLoader в общих контейнерах . Короче говоря, в настройках мы загрузили несколько контекстов приложения, и они не были сборщиками мусора из-за наличия вложения в ClassLoader. Таким образом, у нас было множество объектов (SessionFactory), которые нельзя было собрать мусором, удерживая память.
Мы изменили нашу настройку, чтобы использовать один полный контекст приложения (со всеми определенными bean-компонентами), используемый всеми тестовыми классами. Это работает для обоих случаев; при индивидуальном запуске тестов и выполнении всех тестов вместе.
Однако есть несколько проблем, которые мы собираемся решить с помощью этой настройки:
Основная проблема заключается в том, что эта настройка не позволяет нам тестировать части приложения изолированно, поскольку все компоненты и их зависимости определены в контексте приложения, а не проверяются.
Вторая проблема заключается в том, что когда мы запускаем отдельные тесты, загрузка контекста приложения занимает 30-40 секунд, что в итоге приводит к довольно непродуктивным результатам, когда вам приходится запускать тест несколько раз.
Любые предложения / советы будут высоко оценены.
Надеюсь, я был достаточно ясен, не стесняйтесь задавать любые вопросы.
Заранее спасибо
Martin