1

У моего приложения dropwizard есть тест интеграции, в котором я использую базу данных hibernate h2 для хранения данных. Для второй части теста я использую jersey-testframework для обработки ресурсов и вызовов отдыха.Dropwizard-Hibernate Обработка транзакций для тестов интеграции

Чтобы эти две части работали вместе, мне пришлось создать TestRule для каждого случая.

Hibernate:

@ClassRule 
public static final SessionFactoryRule sessionFactoryRule = new SessionFactoryRule(User.class, HibernateUtil.getHibernateClasses()); 
public static final ProgramDAO programDao = new ProgramDAO(sessionFactoryRule.getSessionFactory()); 

Джерси:

@ClassRule 
public static final ResourceTestRule resources = ResourceTestRule.builder() 
     .setTestContainerFactory(new GrizzlyWebTestContainerFactory()) 
     .addProvider(new AuthDynamicFeature(
       new OAuthCredentialAuthFilter.Builder<User>() 
         .setAuthenticator(new OAuthAuthenticator(userManagement)) 
         .setAuthorizer(new OAuthAuthorizer()) 
         .setPrefix(TOKEN_TYPE) 
         .buildAuthFilter())) 
     .addProvider(new AuthValueFactoryProvider.Binder<>(User.class)) 
     .addProvider(RolesAllowedDynamicFeature.class) 
     .addResource(new AdResource(urlMapperMock, programDao)) 
     .build(); 

Н2 зимуют дб конфигурации

Configuration configuration = new Configuration() 
      .setInterceptor(new SoftDeleteInterceptor()) 
      .setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect") 
      .setProperty("hibernate.connection.driver_class", "org.h2.Driver") 
      .setProperty("hibernate.connection.url", "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1") 
      .setProperty("hibernate.hbm2ddl.auto", "create") 
      .setProperty("hibernate.default_batch_fetch_size", "200") 
      .setProperty("hibernate.show_sql", "false") 
      .setProperty("hibernate.current_session_context_class", "thread"); 

Теперь Whe п я называю запрос на ресурсе ...

@Test 
public void resourceCheck() { 
    javax.ws.rs.core.Response response = resources.getJerseyTest().target(Ad.TABLE_NAME).request().header(HEADER_KEY_AUTHORIZATION, HEADER_VALUE_VALID_BEARER_TOKEN).get(); 
    assertThat(response.getStatus()).isEqualTo(200); 
} 

... следующая ошибка брошено

ERROR [2016-01-26 11:23:21,594] org.glassfish.grizzly.servlet.ServletHandler: service exception: 
! org.hibernate.HibernateException: getNamedQuery is not valid without active transaction 
! at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final] 
! at com.sun.proxy.$Proxy74.getNamedQuery(Unknown Source) ~[na:na] 
! at io.dropwizard.hibernate.AbstractDAO.namedQuery(AbstractDAO.java:57) ~[dropwizard-hibernate-0.9.1.jar:0.9.1] 
! at com.ad4mat.api.db.core.AdDAO.findAllByUser(AdDAO.java:36) ~[classes/:na] 
! at com.ad4mat.api.resource.AdResource.getAll(AdResource.java:79) ~[classes/:na] 

Видимо нет обработки для TestCase транзакции, но там должна быть одна.

My normal dropwizard приложение работает нормально. Операции обрабатываются путем уведомления ресурсов с помощью @UnitOfWork.

Когда я добавить сделку Мануэль в дао, как ...

public List<Ad> findAllByUser(User user) { 
    currentSession().beginTransaction(); 
    Query query = namedQuery("ad.findAllByUser") 
         .setParameter(User.FOREIGN_COLUMN_ID, user.getId()); 
    return query.list(); 

тест интеграции работает, но мое приложение будет бросать исключение вложенной транзакции.

Так что мой вопрос:

Как сделать @UnitOfWork аннотаций для процесса тестирования интеграции. Очевидно, что отсутствует реализация обработки транзакций. У меня есть jersey.register() определенный компонент Dropwizard-Hibernate?

ответ

2

Как и версия dropwizard версии 0.9.2, можно использовать аннотацию @UnitOfWork вне контекстов Джерси. Возможно, обновление dropwizard - это то, что вы ищете; то вы должны иметь возможность делать материал базы данных из любого контекста (наиболее важного из контекста junit/testng). http://www.dropwizard.io/0.9.2/docs/about/release-notes.html

Смежные вопросы