При разработке веб-приложений с помощью связки Spring+Hibernate тестирование становится достаточно нетривиальной задачей, если подходить к ней в лоб. В процессе запуска теста необходимо выполнить следующие шаги: поднять контекст Spring'a, произвести необходимые dependency-injection, обеспечить открытую сессию Hibernate на протяжении выполнения теста (в веб-приложениях эту работу выполняет OpenSessionInViewFilter, который держит сессию открытой на период обслуживания запроса пользователя). Рассмотрим как это сделать на примере использования распространенного фреймворка для тестирования JUnit версии 4.4 (более новая версия 4.5 имеет проблемы совместимости со Spring) и модуля Spring-tests из SpringModules (spring-test.jar). Класс простейшего теста приведен ниже:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring-config.xml" })
public class MessageServiceTest {
private MessageStringDataServiceInterface messageStringDataService;
private DefaultWebConfig defaultWebConfig;
private SessionFactory sessionFactory;
@Autowired
public void setDefaultWebConfig(DefaultWebConfig defaultWebConfig) {
this.defaultWebConfig = defaultWebConfig;
}
@Autowired
public void setMessageStringDataService(
 MessageStringDataServiceInterface messageStringDataService) {
this.messageStringDataService = messageStringDataService;
}
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Test
public void onSetUp() {
TransactionSynchronizationManager.bindResource(sessionFactory,
  new SessionHolder(sessionFactory.openSession()));
}
@Test
public void testMessageDataService() throws DomainException {
assertNull(messageStringDataService.getMessageString("test.message",
  defaultWebConfig.getDefaultLanguage()));
}
@Test
public void onTearDown() {
TransactionSynchronizationManager
  .unbindResourceIfPossible(sessionFactory);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring-config.xml" })
 

Комментариев нет:
Отправить комментарий