2015-06-08 1 views
4

При использовании Arquillian для тестирования объектов (JPA) как части теста интеграции кажется, что все работает, кроме тестирования для ConstraintViolation. Например, не должно быть возможности сохранить экземпляр объекта, который имеет значения null в полях, аннотированных с @NotNull Bean Validation. Вместо ConstrainViolationException я ArquillianProxyException:ArquillianProxyException вместо ConstrainViolationException в JUnit @Test (ожидается)

Unexpected exception, expected<javax.validation.ConstraintViolationException> but was<org.jboss.arquillian.test.spi.ArquillianProxyException> 

Это мой простой тест:

@Test(expected = ConstraintViolationException.class) // not set required fields 
public void shouldNotCreateNewFirm() { 

    // Create instance of firm entity 
    Firm firm = new Firm("[email protected]", "allegro", "[email protected]", "Allegro Ltd."); 

    // persist the firm to the database 
    transaction.begin(); 
    em.persist(firm); 

    em.remove(firm); 

    transaction.commit(); 
} 

и ошибки детали:

Caused by: org.jboss.arquillian.test.spi.ArquillianProxyException: javax.validation.ConstraintViolationException : Validation failed for classes [pl.salonea.entities.Firm] during persist time for groups [javax.validation.groups.Default, ] 
List of constraint violations:[ 
    ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=companyNumber, rootBeanClass=class pl.salonea.entities.Firm, messageTemplate='{javax.validation.constraints.NotNull.message}'} 
    ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=address, rootBeanClass=class pl.salonea.entities.Firm, messageTemplate='{javax.validation.constraints.NotNull.message}'} 
    ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=vatin, rootBeanClass=class pl.salonea.entities.Firm, messageTemplate='{javax.validation.constraints.NotNull.message}'} 
] [Proxied because : Original exception not deserilizable, ClassNotFoundException] 

ОБНОВЛЕНО (Full Stack):

java.lang.Exception: Unexpected exception, expected<javax.validation.ConstraintViolationException> but was<org.jboss.arquillian.test.spi.ArquillianProxyException> 
    at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:28) 
    at org.jboss.arquillian.junit.Arquillian$4.evaluate(Arquillian.java:226) 
    at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314) 
    at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46) 
    at org.jboss.arquillian.junit.Arquillian$5.evaluate(Arquillian.java:240) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:185) 
    at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314) 
    at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46) 
    at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:199) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:147) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69) 
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:48) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) 
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) 
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:105) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360) 
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.jboss.arquillian.test.spi.ArquillianProxyException: javax.validation.ConstraintViolationException : Validation failed for classes [pl.salonea.entities.Firm] during persist time for groups [javax.validation.groups.Default, ] 
List of constraint violations:[ 
    ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=vatin, rootBeanClass=class pl.salonea.entities.Firm, messageTemplate='{javax.validation.constraints.NotNull.message}'} 
    ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=address, rootBeanClass=class pl.salonea.entities.Firm, messageTemplate='{javax.validation.constraints.NotNull.message}'} 
    ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=companyNumber, rootBeanClass=class pl.salonea.entities.Firm, messageTemplate='{javax.validation.constraints.NotNull.message}'} 
] [Proxied because : Original exception not deserilizable, ClassNotFoundException] 
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:160) 
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:95) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:214) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:92) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:490) 
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:195) 
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:179) 
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:214) 
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:324) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125) 
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:84) 
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:206) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:149) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181) 
    at FirmIT.shouldNotCreateNewFirm(FirmIT.java:80) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.jboss.arquillian.junit.Arquillian$6$1.invoke(Arquillian.java:270) 
    at org.jboss.arquillian.container.test.impl.execution.LocalTestExecuter.execute(LocalTestExecuter.java:60) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:115) 
    at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67) 
    at org.jboss.arquillian.container.test.impl.execution.ContainerTestExecuter.execute(ContainerTestExecuter.java:38) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81) 
    at org.jboss.arquillian.test.impl.TestContextHandler.createTestContext(TestContextHandler.java:102) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88) 
    at org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:84) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88) 
    at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:65) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135) 
    at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.test(EventTestRunnerAdaptor.java:111) 
    at org.jboss.arquillian.junit.Arquillian$6.evaluate(Arquillian.java:263) 
    at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:19) 
    at org.jboss.arquillian.junit.Arquillian$4.evaluate(Arquillian.java:226) 
    at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314) 
    at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46) 
    at org.jboss.arquillian.junit.Arquillian$5.evaluate(Arquillian.java:240) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:185) 
    at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:314) 
    at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:46) 
    at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:199) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:147) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:115) 
    at org.jboss.arquillian.junit.container.JUnitTestRunner.execute(JUnitTestRunner.java:65) 
    at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.executeTest(ServletTestRunner.java:160) 
    at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.execute(ServletTestRunner.java:126) 
    at org.jboss.arquillian.protocol.servlet.runner.ServletTestRunner.doGet(ServletTestRunner.java:90) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) 
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) 
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) 
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) 
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) 
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) 
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) 
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) 
    at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) 
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247) 
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76) 
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166) 
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197) 
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759) 
    ... 3 more 
+0

Вам нужен ConstraintViolationException на клиента классам для того, чтобы правильно десериализации. –

ответ

2

Является ли ваш Firm экземпляром сериализуемым? ConstraintViolation содержит ссылку на корневой компонент (ваш пример Firm). Чтобы иметь возможность сериализовать ConstraintViolationException, полное исключение должно быть сериализуемым. Я предполагаю, что это не так в вашем случае использования. В этом случае Аркиллиан должен отправить обратно прокси. В документах для ArquillianProxyException указывается:

Класс исключения, используемый, когда исключение прокси не может быть создано. Этот тип исключения вызывается вместо этого и содержит информацию о прокси-классе и подсказку о том, почему его нельзя было выбросить.

На самом деле, на второй взгляд, есть также ClassNotFoundException, что может указывать на отсутствие классов на стороне клиента. Это может помочь увидеть полную трассировку стека.

+0

Хорошо, я проверяю это ... Фирма расширяет UserAccount, который реализует Serializable –

+0

У меня была аналогичная проблема. Я использовал исключение, основанное на базе WebApplicationException, которое внутренне содержит ссылку на Response, которая не является сериализуемой. Таким образом, вся эта хорошая иерархия исключений JAX-RS не пригодна для использования в классах услуг в контексте аркильских тестов. – arpadf

1

Я работаю над аналогичным примером, используя проверку Bean в контексте теста интеграции. Я столкнулся с той же проблемой, что и в вашем вопросе. Я до сих пор не знаю, почему это вызывает ArquillianProxyException как все используемые классы реализации Serializable, но я нашел возможное решение, предложенное Дэвидом Belzer, который можно найти здесь: https://blog.david-belzer.de/2014/04/arquillian-unittest-exceptionhandling/ (немецкий блог запись)

вместо указания ожидания в @Test Аннотации a @Rule аннотированное поле ExpectedException должно быть объявлено для этого прецедента.

Использование может выглядеть следующим образом (взято из блога):

@Rule 
    public ExpectedException thrown = ExpectedException.none(); 

    @Test 
    public void shouldNotCreateNewFirm() { 

     // not set required fields 
     thrown.expect(ConstraintViolationException.class); 

     // Create instance of firm entity 
     Firm firm = new Firm("[email protected]", "allegro", "[email protected]", "Allegro Ltd."); 

     // persist the firm to the database 
     transaction.begin(); 
     em.persist(firm); 

     em.remove(firm); 

     transaction.commit(); 
    } 

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

  • Нет связанных вопросов^_^