2013-08-06 4 views
3

Я использую Arquillian со встроенным контейнером Glassfish 4.0 для тестирования. До сих пор мне удалось заставить его работать, но один тестовый сценарий терпит неудачу, и я не знаю, почему. Вот мой тест код:JavaEE CDI Тестирование: получить причину RollbackException

// Test Class 
    @Inject 
    private CompetenceService competenceService; 

    @Test 
    public void createSingleCompetence() { 
     Competence c = new Competence(); 
     // fill the competence with data 
     c = competenceService.save(c); // throws a RollbackException 
     // some testing assertions 
    } 

И это Класс обслуживания:

// CompetenceService 
@Transactional 
@ApplicationScoped 
public class CompetenceService { 

    @PersistenceContext 
    private EntityManager em; 

    public Competence save(Competence c){ 
     return em.merge(c); 
    } 
} 

При выполнении этого с arquillian, появляется следующее сообщение об ошибке:

Managed bean with Transactional annotation and TxType of REQUIRED encountered exception during commit javax.transaction.RollbackException: Transaction marked for rollback 

Мой вопрос: могу ли я как-то выяснить, что происходит не так? Моя первая мысль заключалась в том, что не все ограничения были удовлетворены (например, @NotNull), но я решил это сейчас.

Я не получаю полный стек, только ошибка в конце testrun. Вот вывод:

[Competence test competence] 
Aug 07, 2013 8:28:57 AM org.glassfish.cdi.transaction.TransactionalInterceptorRequired transactional 
INFO: In REQUIRED TransactionalInterceptor 
Aug 07, 2013 8:28:57 AM org.glassfish.cdi.transaction.TransactionalInterceptorRequired transactional 
INFO: Managed bean with Transactional annotation and TxType of REQUIRED called outside a transaction context. Beginning a transaction... 
Aug 07, 2013 8:28:57 AM org.glassfish.cdi.transaction.TransactionalInterceptorBase markRollbackIfActiveTransaction 
INFO: About to setRollbackOnly from @Transactional interceptor on transaction:JavaEETransactionImpl: txId=1 nonXAResource=1 jtsTx=null localTxStatus=0 syncs=[org.eclip[email protected]fe04c00, [email protected]e9d9c24, [email protected]d7627ce, com.sun.e[email protected]82f6d1d] 
Aug 07, 2013 8:28:57 AM org.glassfish.cdi.transaction.TransactionalInterceptorRequired transactional 
INFO: Managed bean with Transactional annotation and TxType of REQUIRED encountered exception during commit javax.transaction.RollbackException: Transaction marked for rollback. 
Aug 07, 2013 8:28:58 AM org.glassfish.persistence.common.Java2DBProcessorHelper executeDDLs 
WARNING: PER01000: Got SQLException executing statement "ALTER TABLE COMPETENCECATEGORY DROP CONSTRAINT CMPTWNNGNSTNCNTTYD": java.sql.SQLSyntaxErrorException: ALTER TABLE failed. There is no constraint 'APP.CMPTWNNGNSTNCNTTYD' on table '"APP"."COMPETENCECATEGORY"'. 
PlainTextActionReporterSUCCESS 
PER01003: Deployment encountered SQL Exceptions: 
PER01000: Got SQLException executing statement "ALTER TABLE COMPETENCECATEGORY DROP CONSTRAINT CMPTWNNGNSTNCNTTYD": java.sql.SQLSyntaxErrorException: ALTER TABLE failed. There is no constraint 'APP.CMPTWNNGNSTNCNTTYD' on table '"APP"."COMPETENCECATEGORY"'. Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 23.032 sec <<< FAILURE! 
Aug 07, 2013 8:29:01 AM org.glassfish.admin.mbeanserver.JMXStartupService shutdown 
INFO: JMXStartupService and JMXConnectors have been shut down. 
JdbcRuntimeExtension, getAllSystemRAResourcesAndPools = [GlassFishConfigBean.org.glassfish.jdbc.config.JdbcResource, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcResource, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcConnectionPool, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcConnectionPool, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcConnectionPool, GlassFishConfigBean.org.glassfish.jdbc.config.JdbcResource] 
Aug 07, 2013 8:29:01 AM com.sun.enterprise.connectors.service.ResourceAdapterAdminServiceImpl sendStopToResourceAdapter 
INFO: RAR7094: __ds_jdbc_ra shutdown successful. 
Aug 07, 2013 8:29:01 AM com.sun.enterprise.v3.server.AppServerStartup stop 
INFO: Shutdown procedure finished 

Results : 

Tests in error: 
    createSingleCompetence(at.seresunit.outtasking.test.CompetenceTest): Managed bean with Transactional annotation and TxType of REQUIRED encountered exception during commit javax.transaction.RollbackException: Transaction marked for rollback. 

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0 

------------------------------------------------------------------------ 
BUILD FAILURE 
------------------------------------------------------------------------ 
+0

Вы не получаете никакой трассировки стека или чего-либо в консоли или в качестве возврата? Я также предполагаю, что ваше исключение происходит после метода сохранения? – LightGuard

+0

привет, я обновил вопрос будет выход я получаю. Кроме того, исключение происходит из-за метода save, после этого не выполняется никаких инструкций. – bmurauer

ответ

2

Это не проблема с Аркиллиан.

Поскольку вы не можете найти исключение в StackTrace, я предполагаю, что исходное исключение завернуто в исключение RollbackException. В соответствии со спецификацией JTA 1.2 любое неконтролируемое исключение автоматически откатывается от транзакции.

Можете ли вы подтвердить, что никакое исключенное исключение (например, RuntimeException, Nullpointer и т. Д.) Не выбрасывается ни в один из ваших основных методов - может даже возникнуть из какого-то пользовательского валидатора. Это спецификация JTA 1.2 для дальнейшей справки: https://java.net/projects/jta-spec/sources/spec-source-repository/content/jta-1_2-spec_v2.pdf?rev=14

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