JUnit4, Spring, настройка контекста тестов Hibernate - PullRequest
0 голосов
/ 22 августа 2011

Просто нужен небольшой совет о том, как настроить «модульное» тестирование с 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

1 Ответ

0 голосов
/ 22 августа 2011

Spring 3.1 представит XML Profiles - это может быть хорошим способом работы с различными настройками теста.Это должно быть выпущено в этом году - хотя у них уже есть задержка в выпуске RC1.Тем не менее, я бы попробовал выпустить Milestone (я уже это сделал).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...