Hi,

I have a project with EJB3 Seam components. I write unit tests that will run
on OpenEJB, but I encounter a problem I can't find it is a Seam or OpenEJB
one.

I wrote a Seam component with CONVERSATION scope, i.e. a stateful session
bean. I wrote the following unit test for this component :

    public void testSaveAndDeleteOrganizationType()  throws
java.lang.Exception
    {
        new ComponentTest() {
            public void testComponents() throws java.lang.Exception {

                OrganizationInternalServiceLocal service =
(OrganizationInternalServiceLocal)
getInstance("organizationInternalService");

                // Create a new organization type

                OrganizationType newOrganizationType = new
OrganizationType();
                newOrganizationType.setCode("ORG_TYPE_TEST");
                newOrganizationType.setName("Test organization type");
                newOrganizationType =
service.saveOrganizationType(newOrganizationType);
                assert newOrganizationType.getId() != null;

                // Create a duplicated organization type

                try {
                    OrganizationType duplicatedOrganizationType = new
OrganizationType();
                    duplicatedOrganizationType.setCode("ORG_TYPE_TEST");
                    duplicatedOrganizationType.setName("Test organization
type");
                    duplicatedOrganizationType =
service.saveOrganizationType(duplicatedOrganizationType);
                    assert false;
                }
                catch (Exception exception){
                    assert true;
                }

                // Delete an organization type

                service.deleteOrganizationType(newOrganizationType);
                assert service.loadOrganizationType("ORG_TYPE_TEST") ==
null;

            }
        }.run();
    }

I have a unique constraint on code property of organization type. So when I
try to save an organization type with a code that is already in database,
the saveOrganizationType is expected to throw an exception. Actually it
does, no problem about that. But further calls to the component, for example
deleteOrganizationType method, fail with the following stack trace :

testSaveAndDeleteOrganizationType(t4.core.commons.organization.internal.test.OrganizationInternalServiceTest)
Time elapsed: 0.156 sec  <<< FAILURE!
javax.ejb.NoSuchEJBException: reference is invalid
    at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.isValidReference(BaseEjbProxyHandler.java:319)
    at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:232)
    at $Proxy135.deleteOrganizationType(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
    at
org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31)
    at
org.jboss.seam.intercept.ClientSideInterceptor$1.proceed(ClientSideInterceptor.java:76)
    at
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
    at
org.jboss.seam.ejb.RemoveInterceptor.aroundInvoke(RemoveInterceptor.java:43)
    at
org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
    at
org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
    at
org.jboss.seam.intercept.ClientSideInterceptor.invoke(ClientSideInterceptor.java:54)
    at
org.javassist.tmp.java.lang.Object_$$_javassist_27.deleteOrganizationType(Object_$$_javassist_27.java)
    at
t4.core.commons.organization.internal.test.OrganizationInternalServiceTest$26.testComponents(OrganizationInternalServiceTest.java:1276)
    at
org.jboss.seam.mock.AbstractSeamTest$ComponentTest.run(AbstractSeamTest.java:163)
    at
t4.core.commons.organization.internal.test.OrganizationInternalServiceTest.testSaveAndDeleteOrganizationType(OrganizationInternalServiceTest.java:1246)

If I set the component to STATELESS scope, i.e. staless session bean, my
unit test works OK ! So what I note is that throwing an exception from a
stateful session bean turns it to invalid. Do you think this is a problem
with OpenEJB or with Seam ?

Thanks in advance,

Olivier

Reply via email to