11 Replies Latest reply on Sep 16, 2010 5:21 AM by stephanos

    Using OpenEJB for integration testing

    stephanos

      Hi,


      I'm wondering if anyone tried and succeeded using OpenEJB (or even Glassfish) for integration testing instead of JBoss Embedded (didn't work out for me). I found an interesting post in the AndroMDA forum, but it's quite old. I tried applying the code from it. I managed to use Component.getInstance(..) successfully, however, when it came to JPA/DB related things it would crash:


      Caused by: org.jboss.seam.RequiredException: @In attribute requires non-null value: userDAO.em



      Looking at the log, no JPA/Hibernate stuff is initialized. I'm not sure why, a persistence.xml and the appropriate Hibernate JARs are on the classpath. Weird.


      Suggestions welcome!


      PS: If anybody is interested in the code that got me so far, just tell me and I can post it (simply saves the time of fitting the several .diff's at AndroMDA together).


      Cheers,
      Stephan

        • 1. Re: Using OpenEJB for integration testing
          doneit

          Hi,


          I am also trying to use OpenEJB for testing Seam Components. I would be glad if you could post your code.


          doneit

          • 2. Re: Using OpenEJB for integration testing
            stephanos

            Sure. Most part of the code is from the post in the above mentioned AndroMDA forum. I haven't worked on it for a while so meanwhile I get a new Exception (must be because of update to 2.1.1): java.lang.UnsupportedOperationException: no transaction.
            I haven't the slightest idea why it doesn't apparently pick up my persistence.xml (see console log at the bottom).


            I have no clue about the stuff behind the scenes so I wasn't able to figure it out on my own (and yet the community didn't seem to be interested in it)...



            The pom entries:


                    <dependency>
                        <groupId>org.apache.openejb</groupId>
                        <artifactId>openejb-core</artifactId>
                        <version>3.0</version>
                        <exclusions>
                            <exclusion>
                                <groupId>org.apache.openjpa</groupId>
                                <artifactId>openjpa</artifactId>
                            </exclusion>
                            <exclusion>
                                <groupId>hsqldb</groupId>
                                <artifactId>hsqldb</artifactId>
                            </exclusion>
                            <exclusion>
                                <groupId>junit</groupId>
                                <artifactId>junit</artifactId>
                            </exclusion>
                        </exclusions>
                    </dependency>
            
                    <dependency>
                        <groupId>org.jboss.logging</groupId>
                        <artifactId>jboss-logging-spi</artifactId>
                        <version>2.0.5.GA</version>
                    </dependency>



            The base class:



            public class ContainerEnvironment
                    extends AbstractSeamTest {
            
                private static boolean started = false;
            
                private static InitialContext initialContext = null;
            
                private static InitialContext securedInitialContext = null;
            
                /**
                 * ********* Setup ***********
                 */
                @BeforeSuite
                // needs a WEB-INF/web.xml in resources!!!
                public void beforeSuite () throws Exception {
                    startSeam ();
                }
            
                @BeforeClass
                public void beforeClass () throws Exception {
                    setupClass ();
                }
            
                @BeforeMethod
                @Override
                public void begin () {
                    super.begin ();
                    //TestLifecycle.beginTest (servletContext, new ServletSessionMap (getSession ()));
                }
            
                @AfterMethod
                @Override
                public void end () {
                    //TestLifecycle.endTest ();
                    super.end ();
                }
            
                @AfterClass
                public void afterClass () throws Exception {
                    cleanupClass ();
                }
            
                @AfterSuite
                public void afterSuite () throws Exception {
                    stopSeam ();
                }
            
                /**
                 * ********* Methods ***********
                 */
            
                @Override
                protected void startJbossEmbeddedIfNecessary ()
                        throws Exception {
            
                    if (!started && openEjbAvailable ()) {
                        new OpenEjbBootstrap ().startAndDeployResources ();
                    }
                    started = true;
                }
            
                private boolean openEjbAvailable () {
            
                    try {
                        Class.forName ("org.apache.openejb.OpenEJB");
                        return true;
                    } catch (ClassNotFoundException e) {
                        return false;
                    }
                }
            
                @Override
                protected InitialContext getInitialContext ()
                        throws NamingException {
            
                    return getStaticInitialContext ();
                }
            
                public static InitialContext getStaticInitialContext ()
                        throws NamingException {
            
                    if (initialContext == null) {
                        loadInitialContext ();
                    }
                    return initialContext;
                }
            
                /**
                 * Return a new InitialContext based on org.jnp.interfaces.LocalOnlyContextFactory,
                 * setting the the default context.
                 *
                 * @return javax.naming.InitialContext
                 * @throws Exception
                 */
                public InitialContext newInitialContext ()
                        throws Exception {
            
                    final Hashtable<String, String> props = getInitialContextProperties ();
                    initialContext = new InitialContext (props);
                    return initialContext;
                }
            
                /**
                 * Return a new InitialContext based on org.jboss.security.jndi.JndiLoginInitialContextFactory,
                 * setting the default context. Use the specified username and password to set the security context.
                 *
                 * @param pPrincipal
                 * @param credential
                 * @return javax.naming.InitialContext
                 * @throws Exception
                 */
                public InitialContext newInitialContext (final String pPrincipal,
                                                         final String pCredential)
                        throws Exception {
            
                    final Hashtable<String, String> props =
                            getInitialContextProperties (pPrincipal, pCredential);
                    securedInitialContext = new InitialContext (props);
                    return securedInitialContext;
                }
            
                /**
                 * Return the default InitialContext based on org.jnp.interfaces.LocalOnlyContextFactory
                 * if one is already instantiated, otherwise create a new InitialContext and set as the default.
                 *
                 * @return javax.naming.InitialContext
                 * @throws javax.naming.NamingException
                 */
                public static InitialContext loadInitialContext ()
                        throws NamingException {
            
                    if (initialContext == null) {
                        final Hashtable props = getInitialContextProperties ();
            
            //            URL config = this.getClass ().getClassLoader ().getResource ("openejb.xml");
            //            props.put ("openejb.configuration", config.toExternalForm ());
            
                        initialContext = new InitialContext (props);
                    }
                    return initialContext;
                }
            
                /**
                 * Return the default InitialContext based on org.jboss.security.jndi.JndiLoginInitialContextFactory
                 * if one is already instantiated, otherwise create a new InitialContext and set as the default.
                 * Use the specified username and password to set the security context.
                 *
                 * @param pPrincipal
                 * @param pCredential
                 * @return
                 * @throws javax.naming.NamingException
                 */
                public InitialContext loadInitialContext (final String pPrincipal,
                                                          final String pCredential)
                        throws NamingException {
            
                    if (securedInitialContext == null) {
                        final Hashtable<String, String> props =
                                getInitialContextProperties (pPrincipal, pCredential);
                        securedInitialContext = new InitialContext (props);
                    }
                    return securedInitialContext;
                }
            
                private static Hashtable<String, String> getInitialContextProperties () {
            
                    final Hashtable<String, String> props = new Hashtable<String, String> (1);
                    props.put (Context.INITIAL_CONTEXT_FACTORY,
                               "org.apache.openejb.client.LocalInitialContextFactory");
                    return props;
                }
            
                private Hashtable<String, String> getInitialContextProperties (final String pPrincipal,
                                                                               final String pCredential) {
            
                    final Hashtable<String, String> props = new Hashtable<String, String> (2);
                    props.put (Context.INITIAL_CONTEXT_FACTORY,
                               "org.apache.openejb.client.LocalInitialContextFactory");
                    props.put (Context.SECURITY_PRINCIPAL, pPrincipal);
                    props.put (Context.SECURITY_CREDENTIALS, pCredential);
                    return props;
                }



            The test class:



            public class FunctionalTesting
                    extends ContainerEnvironment {
            
                public void test () throws Exception {
            
                    new ComponentTest() {
            
                        @Override
                        protected void testComponents () throws Exception {
            
                            final Identity identity = (Identity) Component.getInstance (Identity.class);
                            assert identity != null;
                        }
                    }.run ();
                }



            and finally my current console log:



            Apache OpenEJB 3.0    build: 20080408-04:13
            http://openejb.apache.org/
            INFO - openejb.home = /home/stephan/dev/workspace/vilea.author.portal.lib
            INFO - openejb.base = /home/stephan/dev/workspace/vilea.author.portal.lib/src/test/resources
            INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
            INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
            INFO - Configuring Service(id=Default JDK 1.3 ProxyFactory, type=ProxyFactory, provider-id=Default JDK 1.3 ProxyFactory)
            INFO - Namespace: http://jboss.com/products/seam/framework, package: org.jboss.seam.framework, prefix: org.jboss.seam.core.framework
            INFO - Namespace: http://jboss.com/products/seam/async, package: org.jboss.seam.async, prefix: org.jboss.seam.async
            INFO - Namespace: http://jboss.com/products/seam/theme, package: org.jboss.seam.theme, prefix: org.jboss.seam.theme
            INFO - Namespace: http://jboss.com/products/seam/security, package: org.jboss.seam.security.management, prefix: org.jboss.seam.security
            INFO - Namespace: http://jboss.com/products/seam/mail, package: org.jboss.seam.mail, prefix: org.jboss.seam.mail
            INFO - Namespace: http://jboss.com/products/seam/bpm, package: org.jboss.seam.bpm, prefix: org.jboss.seam.bpm
            INFO - Namespace: http://jboss.com/products/seam/security, package: org.jboss.seam.security, prefix: org.jboss.seam.security
            INFO - Namespace: http://jboss.com/products/seam/web, package: org.jboss.seam.web, prefix: org.jboss.seam.web
            INFO - Namespace: http://jboss.com/products/seam/captcha, package: org.jboss.seam.captcha, prefix: org.jboss.seam.captcha
            INFO - Namespace: http://jboss.com/products/seam/navigation, package: org.jboss.seam.navigation, prefix: org.jboss.seam.navigation
            INFO - Namespace: http://jboss.com/products/seam/resteasy, package: org.jboss.seam.resteasy, prefix: 
            INFO - Namespace: http://jboss.com/products/seam/core, package: org.jboss.seam.core, prefix: org.jboss.seam.core
            INFO - Namespace: http://jboss.com/products/seam/international, package: org.jboss.seam.international, prefix: org.jboss.seam.international
            INFO - Namespace: http://jboss.com/products/seam/cache, package: org.jboss.seam.cache, prefix: org.jboss.seam.cache
            INFO - Namespace: http://jboss.com/products/seam/jms, package: org.jboss.seam.jms, prefix: org.jboss.seam.jms
            INFO - Namespace: http://jboss.com/products/seam/ui, package: org.jboss.seam.ui, prefix: org.jboss.seam.ui
            INFO - Namespace: http://jboss.com/products/seam/transaction, package: org.jboss.seam.transaction, prefix: org.jboss.seam.transaction
            INFO - Namespace: http://jboss.com/products/seam/security, package: org.jboss.seam.security.permission, prefix: org.jboss.seam.security
            INFO - Namespace: http://jboss.com/products/seam/drools, package: org.jboss.seam.drools, prefix: org.jboss.seam.drools
            INFO - Namespace: http://jboss.com/products/seam/persistence, package: org.jboss.seam.persistence, prefix: org.jboss.seam.persistence
            INFO - Namespace: http://jboss.com/products/seam/document, package: org.jboss.seam.document, prefix: org.jboss.seam.document
            INFO - reading properties from: /seam.properties
            INFO - reading properties from: /jndi.properties
            INFO - initializing Seam
            INFO - Component: org.jboss.seam.core.init, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.core.Init
            INFO - two components with same name, higher precedence wins: org.jboss.seam.web.parameters
            INFO - two components with same name, higher precedence wins: userActivationService
            INFO - two components with same name, higher precedence wins: org.jboss.seam.persistence.persistenceProvider
            INFO - two components with same name, higher precedence wins: org.jboss.seam.captcha.captcha
            INFO - two components with same name, higher precedence wins: org.jboss.seam.transaction.synchronizations
            INFO - two components with same name, higher precedence wins: org.jboss.seam.web.isUserInRole
            INFO - two components with same name, higher precedence wins: org.jboss.seam.core.resourceLoader
            INFO - two components with same name, higher precedence wins: org.jboss.seam.web.userPrincipal
            INFO - two components with same name, higher precedence wins: org.jboss.seam.core.manager
            INFO - two components with same name, higher precedence wins: org.jboss.seam.core.locale
            INFO - two components with same name, higher precedence wins: org.jboss.seam.core.expressions
            INFO - two components with same name, higher precedence wins: org.jboss.seam.core.locale
            INFO - Installing components...
            [...my stuff...]
            INFO - Component: org.jboss.seam.async.asynchronousExceptionHandler, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.async.AsynchronousExceptionHandler
            INFO - Component: org.jboss.seam.async.dispatcher, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.async.ThreadPoolDispatcher
            INFO - Component: org.jboss.seam.captcha.captcha, scope: SESSION, type: JAVA_BEAN, class: com.sunshock.portal.action.AdvancedCaptcha
            INFO - Component: org.jboss.seam.captcha.captchaImage, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.captcha.CaptchaImage
            INFO - Component: org.jboss.seam.core.ConversationIdGenerator, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationIdGenerator
            INFO - Component: org.jboss.seam.core.contexts, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.Contexts
            INFO - Component: org.jboss.seam.core.conversation, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.core.Conversation
            INFO - Component: org.jboss.seam.core.conversationEntries, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationEntries
            INFO - Component: org.jboss.seam.core.conversationListFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationList
            INFO - Component: org.jboss.seam.core.conversationPropagation, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationPropagation
            INFO - Component: org.jboss.seam.core.conversationStackFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.ConversationStack
            INFO - Component: org.jboss.seam.core.events, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.core.Events
            INFO - Component: org.jboss.seam.core.expressions, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesExpressions
            INFO - Component: org.jboss.seam.core.interpolator, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.Interpolator
            INFO - Component: org.jboss.seam.core.locale, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.international.Locale
            INFO - Component: org.jboss.seam.core.manager, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesManager
            INFO - Component: org.jboss.seam.core.resourceBundle, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.core.ResourceBundle
            INFO - Component: org.jboss.seam.core.resourceLoader, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.ResourceLoader
            INFO - Component: org.jboss.seam.core.validators, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.core.Validators
            INFO - Component: org.jboss.seam.document.documentStore, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.document.DocumentStore
            INFO - Component: org.jboss.seam.exception.exceptions, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.exception.Exceptions
            INFO - Component: org.jboss.seam.faces.dataModels, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.DataModels
            INFO - Component: org.jboss.seam.faces.facesContext, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesContext
            INFO - Component: org.jboss.seam.faces.facesPage, scope: PAGE, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesPage
            INFO - Component: org.jboss.seam.faces.httpError, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.HttpError
            INFO - Component: org.jboss.seam.faces.redirect, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.faces.Redirect
            INFO - Component: org.jboss.seam.faces.renderer, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.ui.facelet.FaceletsRenderer
            INFO - Component: org.jboss.seam.faces.switcher, scope: PAGE, type: JAVA_BEAN, class: org.jboss.seam.faces.Switcher
            INFO - Component: org.jboss.seam.faces.uiComponent, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.UiComponent
            INFO - Component: org.jboss.seam.faces.validation, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.faces.Validation
            INFO - Component: org.jboss.seam.framework.currentDate, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.framework.CurrentDate
            INFO - Component: org.jboss.seam.framework.currentDatetime, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.framework.CurrentDatetime
            INFO - Component: org.jboss.seam.framework.currentTime, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.framework.CurrentTime
            INFO - Component: org.jboss.seam.graphicImage.image, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.ui.graphicImage.Image
            INFO - Component: org.jboss.seam.international.localeSelector, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.international.LocaleSelector
            INFO - Component: org.jboss.seam.international.messagesFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.international.Messages
            INFO - Component: org.jboss.seam.international.statusMessages, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.faces.FacesMessages
            INFO - Component: org.jboss.seam.international.timeZone, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.international.TimeZone
            INFO - Component: org.jboss.seam.international.timeZoneSelector, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.international.TimeZoneSelector
            INFO - Component: org.jboss.seam.mail.mailSession, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.mail.MailSession
            INFO - Component: org.jboss.seam.navigation.pages, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.navigation.Pages
            INFO - Component: org.jboss.seam.navigation.safeActions, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.navigation.SafeActions
            INFO - Component: org.jboss.seam.persistence.persistenceContexts, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.persistence.PersistenceContexts
            INFO - Component: org.jboss.seam.persistence.persistenceProvider, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.persistence.HibernatePersistenceProvider
            INFO - Component: org.jboss.seam.resteasy.applicationConfig, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.resteasy.ApplicationConfig
            INFO - Component: org.jboss.seam.resteasy.bootstrap, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.resteasy.ResteasyBootstrap
            INFO - Component: org.jboss.seam.resteasy.dispatcher, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.resteasy.ResteasyDispatcher
            INFO - Component: org.jboss.seam.resteasy.resourceAdapter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.resteasy.ResteasyResourceAdapter
            INFO - Component: org.jboss.seam.security.configurationFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.security.Configuration
            INFO - Component: org.jboss.seam.security.credentials, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.security.Credentials
            INFO - Component: org.jboss.seam.security.entityPermissionChecker, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.security.EntityPermissionChecker
            INFO - Component: org.jboss.seam.security.facesSecurityEvents, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.security.FacesSecurityEvents
            INFO - Component: org.jboss.seam.security.identifierPolicy, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.security.permission.IdentifierPolicy
            INFO - Component: org.jboss.seam.security.identity, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.security.Identity
            INFO - Component: org.jboss.seam.security.identityManager, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.security.management.IdentityManager
            INFO - Component: org.jboss.seam.security.management.roleAction, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.security.management.action.RoleAction
            INFO - Component: org.jboss.seam.security.management.roleSearch, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.security.management.action.RoleSearch
            INFO - Component: org.jboss.seam.security.management.userAction, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.security.management.action.UserAction
            INFO - Component: org.jboss.seam.security.management.userSearch, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.security.management.action.UserSearch
            INFO - Component: org.jboss.seam.security.passwordHash, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.security.management.PasswordHash
            INFO - Component: org.jboss.seam.security.permission.permissionSearch, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.security.permission.action.PermissionSearch
            INFO - Component: org.jboss.seam.security.permissionManager, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.security.permission.PermissionManager
            INFO - Component: org.jboss.seam.security.permissionMapper, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.security.permission.PermissionMapper
            INFO - Component: org.jboss.seam.security.persistentPermissionResolver, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.security.permission.PersistentPermissionResolver
            INFO - Component: org.jboss.seam.security.rememberMe, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.security.RememberMe
            INFO - Component: org.jboss.seam.theme.themeFactory, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.theme.Theme
            INFO - Component: org.jboss.seam.theme.themeSelector, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.theme.ThemeSelector
            INFO - Component: org.jboss.seam.transaction.synchronizations, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.transaction.SeSynchronizations
            INFO - Component: org.jboss.seam.transaction.transaction, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.transaction.Transaction
            INFO - Component: org.jboss.seam.transaction.transaction2, scope: EVENT, type: JAVA_BEAN, class: com.sunshock.portal.test.container.MockTransaction
            INFO - Component: org.jboss.seam.ui.EntityConverter, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.seam.ui.EntityConverter
            INFO - Component: org.jboss.seam.ui.entityIdentifierStore, scope: PAGE, type: JAVA_BEAN, class: org.jboss.seam.ui.EntityIdentifierStore
            INFO - Component: org.jboss.seam.ui.entityLoader, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.ui.JpaEntityLoader
            INFO - Component: org.jboss.seam.ui.facelet.faceletCompiler, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.facelet.FaceletCompiler
            INFO - Component: org.jboss.seam.ui.facelet.faceletsJBossLogging, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.facelet.FaceletsJBossLogging
            INFO - Component: org.jboss.seam.ui.facelet.facesContextFactory, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.facelet.RendererFacesContextFactory
            INFO - Component: org.jboss.seam.ui.facelet.mockHttpSession, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.ui.facelet.HttpSessionManager
            INFO - Component: org.jboss.seam.ui.facelet.mockServletContext, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.facelet.ServletContextManager
            INFO - Component: org.jboss.seam.ui.graphicImage.graphicImageResource, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.graphicImage.GraphicImageResource
            INFO - Component: org.jboss.seam.ui.graphicImage.graphicImageStore, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.ui.graphicImage.GraphicImageStore
            INFO - Component: org.jboss.seam.ui.resource.webResource, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.ui.resource.WebResource
            INFO - Component: org.jboss.seam.web.ajax4jsfFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.Ajax4jsfFilter
            INFO - Component: org.jboss.seam.web.ajax4jsfFilterInstantiator, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.ui.filter.Ajax4jsfFilterInstantiator
            INFO - Component: org.jboss.seam.web.exceptionFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.ExceptionFilter
            INFO - Component: org.jboss.seam.web.identityFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.IdentityFilter
            INFO - Component: org.jboss.seam.web.isUserInRole, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.IsUserInRole
            INFO - Component: org.jboss.seam.web.loggingFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.LoggingFilter
            INFO - Component: org.jboss.seam.web.multipartFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.MultipartFilter
            INFO - Component: org.jboss.seam.web.parameters, scope: STATELESS, type: JAVA_BEAN, class: org.jboss.seam.faces.Parameters
            INFO - Component: org.jboss.seam.web.redirectFilter, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.web.RedirectFilter
            INFO - Component: org.jboss.seam.web.servletContexts, scope: EVENT, type: JAVA_BEAN, class: org.jboss.seam.web.ServletContexts
            INFO - Component: org.jboss.seam.web.session, scope: SESSION, type: JAVA_BEAN, class: org.jboss.seam.web.Session
            INFO - Component: org.jboss.seam.web.userPrincipal, scope: APPLICATION, type: JAVA_BEAN, class: org.jboss.seam.faces.UserPrinciple
            [.. my stuff ..]
            INFO - starting up: org.jboss.seam.security.persistentPermissionResolver
            WARN - no permission store available - please install a PermissionStore with the name 'org.jboss.seam.security.jpaPermissionStore' if persistent permissions are required.
            INFO - starting up: org.jboss.seam.security.permissionMapper
            INFO - starting up: org.jboss.seam.navigation.pages
            INFO - no pages.xml file found: /WEB-INF/pages.xml
            INFO - starting up: org.jboss.seam.ui.facelet.faceletsJBossLogging
            INFO - starting up: org.jboss.seam.security.entityPermissionChecker
            INFO - starting up: org.jboss.seam.resteasy.bootstrap
            INFO - deploying Resteasy providers and resources
            INFO - starting up: org.jboss.seam.resteasy.dispatcher
            INFO - registering built-in RESTEasy providers
            INFO - starting up: org.jboss.seam.security.facesSecurityEvents
            FAILED CONFIGURATION: @BeforeSuite beforeSuite
            java.lang.UnsupportedOperationException: no transaction
                 at org.jboss.seam.transaction.NoTransaction.begin(NoTransaction.java:36)
                 at org.jboss.seam.util.Work.workInTransaction(Work.java:42)
                 at org.jboss.seam.transaction.TransactionInterceptor.aroundInvoke(TransactionInterceptor.java:89)
                 at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
                 at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44)
                 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.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:185)
                 at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:103)
                 at com.sunshock.vilea.author.action.init.DatabasePreparation_$$_javassist_6.init(DatabasePreparation_$$_javassist_6.java)
                 at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
                 at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144)
                 at org.jboss.seam.Component.callComponentMethod(Component.java:2211)
                 at org.jboss.seam.core.Events.raiseEvent(Events.java:85)
                 at org.jboss.seam.contexts.ServletLifecycle.endInitialization(ServletLifecycle.java:114)
                 at org.jboss.seam.init.Initialization.init(Initialization.java:735)
                 at com.sunshock.portal.test.container.ContainerEnvironment.startSeam(ContainerEnvironment.java:78)
                 at com.sunshock.portal.test.container.ContainerEnvironment.beforeSuite(ContainerEnvironment.java:36)
                 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
            ... Removed 23 stack frames


            • 3. Re: Using OpenEJB for integration testing
              chawax

              The post you found on AndroMDA forum was mine ;)


              Well it looks like I changed nothing to the ContainerEnvironment class you use as base class for your tests. It still works for me with Seam 2.1.1.GA (but not with 2.1.2.CR1 as you could see in an other post).


              Anyway I don't have the exception you encounter with transactions. But this may be due to the fact I use EJB transactions because all my Seam components are EJB3 session beans (AndroMDA default cartrdige builds EJB3 Seam components, not POJO ones). Is it your case ? Do you use POJO Seam components or EJB3 Seam components ?


              Note I tried to unit test POJO Seam components with OpenEJB a few weeks ago. So I had to use Seam managed persistence contexts, but I couldn't make it work with Open EJB and I finally gave up ... I might have had the same no transaction exception you have, but I am not sure, I don't remember very well ...

              • 4. Re: Using OpenEJB for integration testing
                stephanos

                I thought that name was familiar :-)


                Good advice on the transaction issue, thanks! I'll try that, I'm in fact using POJO components.
                Would be great if it works out.


                I'm only surprised by the lack of interest of other users in this topic because honestly I simply can't get JBoss Embedded working with my setup (maven etc.).


                Cheers,
                Stephan

                • 5. Re: Using OpenEJB for integration testing
                  chawax

                  Stephan B wrote on Apr 19, 2009 13:20:


                  I'm only surprised by the lack of interest of other users in this topic because honestly I simply can't get JBoss Embedded working with my setup (maven etc.).


                  I could make it work with JBoss embedded, but I encountered problems because my EJB3 session beans are generated by AndroMDA in two parts : a base class that is generated from UML model and an implementation class that is generated once. For what I remember, JBoss embedded had problems finding annotations in such classes. So I decided to use OpenEJB instead and it worked much better ;) Moreover JBoss embedded is not fully EJB3 compliant, so I think it would be a good thing if Seam gave the choice to use the EJB3 embedded container you want to run unit tests instead of imposing JBOss embedded.


                  I would like to use POJO Seam components too, so I will investigate further about how to test them with Open EJB. But I have not a lot of time for this for the moment :(

                  • 6. Re: Using OpenEJB for integration testing
                    lpiccoli.lucio.asteriski.com

                    what is the state of openEJB and seam2.2.0GA?


                    is there is active usage or is jboss embedded the only container that works with seam?


                    -lp

                    • 7. Re: Using OpenEJB for integration testing
                      stephanos

                      Actually I made it work.


                      Here are the necessary files:


                      public class ContainerWhiteBoxTest
                              extends BootstrapEnvironment {
                      
                          /**
                           * ********* Methods ***********
                           */
                      
                          protected static <T> T getContextComponent (final Class<T> pClass) {
                      
                              return (T) Component.getInstance (pClass);
                          }
                      
                          protected static <T> T getContextComponent (final String pName) {
                      
                              return (T) Component.getInstance (pName);
                          }
                      
                          protected static <T> T getContextComponent (final String pName,
                                                                      final ScopeType pScope) {
                      
                              return (T) Component.getInstance (pName, pScope);
                          }
                      
                          /**
                           * Call a method binding
                           */
                          protected Object invokeMethod (final String pMethodExpression) {
                      
                              return Expressions.instance ().createMethodExpression (pMethodExpression).invoke ();
                          }
                      
                          /**
                           * Evaluate (get) a value binding
                           */
                          protected Object getValue (final String pValueExpression) {
                      
                              return Expressions.instance ().createValueExpression (pValueExpression).getValue ();
                          }
                      
                          /**
                           * Set a value binding
                           */
                          protected void setValue (final String pValueExpression,
                                                   final Object pValue) {
                      
                              Expressions.instance ().createValueExpression (pValueExpression).setValue (pValue);
                          }
                      
                          /**
                           * ********* Database Component Test Class ***********
                           */
                      
                          public abstract class DBComponentTest
                                  extends ComponentTest {
                      
                              /**
                               * ********* Fields ***********
                               */
                      
                              private EntityTransaction transaction;
                      
                              private EntityManager em;
                      
                              /**
                               * ********* Setup ***********
                               */
                      
                              @Override
                              public void run () throws Exception {
                      
                                  super.run ();
                                  cleanEM ();
                              }
                      
                              @Override
                              protected final void testComponents () throws Exception {
                                  initEM ();
                                  testDBComponents ();
                              }
                      
                              protected abstract void testDBComponents () throws Exception;
                      
                              protected void initEM () {
                      
                                  em = (EntityManager) Component.getInstance ("em");
                                  transaction = em.getTransaction ();
                                  transaction.begin ();
                                  transaction.setRollbackOnly ();
                              }
                      
                              protected void cleanEM () {
                      
                                  if (transaction != null && transaction.isActive ()) {
                                      transaction.rollback ();
                                  }
                              }
                      
                              /**
                               * ********* Get/Set ***********
                               */
                      
                              public EntityManager getEm () {
                                  return em;
                              }
                      
                              public void setEm (final EntityManager pEm) {
                                  em = pEm;
                              }
                      
                              public EntityTransaction getTransaction () {
                                  return transaction;
                              }
                      
                              public void setTransaction (final EntityTransaction pTransaction) {
                                  transaction = pTransaction;
                              }
                          }
                      }




                      public class BootstrapEnvironment
                              extends AbstractSeamTest {
                      
                          private static boolean started = false;
                      
                          private ServletContext servletContext;
                      
                          private static InitialContext initialContext = null;
                      
                          private static InitialContext securedInitialContext = null;
                      
                          /**
                           * ********* Setup ***********
                           */
                          @BeforeSuite
                          // needs a WEB-INF/web.xml in resources!!!
                          public void beforeSuite () throws Exception {
                              startSeam ();
                          }
                      
                          @BeforeClass
                          public void beforeClass () throws Exception {
                              setupClass ();
                          }
                      
                          @BeforeMethod
                          @Override
                          public void begin () {
                              super.begin ();
                              //TestLifecycle.beginTest (servletContext, new ServletSessionMap (getSession ()));
                          }
                      
                          @AfterMethod
                          @Override
                          public void end () {
                              //TestLifecycle.endTest ();
                              super.end ();
                          }
                      
                          @AfterClass
                          public void afterClass () throws Exception {
                              cleanupClass ();
                          }
                      
                          @AfterSuite
                          public void afterSuite () throws Exception {
                              stopSeam ();
                          }
                      
                          /**
                           * ********* Methods ***********
                           */
                      
                          @Override
                          protected void startJbossEmbeddedIfNecessary ()
                                  throws Exception {
                      
                              if (!started && openEjbAvailable ()) {
                                  startOpenEJB ();
                              }
                              started = true;
                          }
                      
                          protected void startOpenEJB () throws Exception {
                      
                              new OpenEjbBootstrap ().startAndDeployResources ();
                          }
                      
                          private boolean openEjbAvailable () {
                      
                              try {
                                  Class.forName ("org.apache.openejb.OpenEJB");
                                  return true;
                              }
                              catch (ClassNotFoundException e) {
                                  return false;
                              }
                          }
                      
                          @Override
                          protected InitialContext getInitialContext ()
                                  throws NamingException {
                      
                              return getStaticInitialContext ();
                          }
                      
                          public static InitialContext getStaticInitialContext ()
                                  throws NamingException {
                      
                              if (initialContext == null) {
                                  loadInitialContext ();
                              }
                              return initialContext;
                          }
                      
                          /**
                           * Return a new InitialContext based on org.jnp.interfaces.LocalOnlyContextFactory,
                           * setting the the default context.
                           *
                           * @return javax.naming.InitialContext
                           * @throws Exception
                           */
                          public InitialContext newInitialContext ()
                                  throws Exception {
                      
                              Hashtable<String, String> props = getInitialContextProperties ();
                              initialContext = new InitialContext (props);
                              return initialContext;
                          }
                      
                          /**
                           * Return a new InitialContext based on org.jboss.security.jndi.JndiLoginInitialContextFactory,
                           * setting the default context. Use the specified username and password to set the security context.
                           *
                           * @param pPrincipal
                           * @param credential
                           * @return javax.naming.InitialContext
                           * @throws Exception
                           */
                          public InitialContext newInitialContext (final String pPrincipal,
                                                                   final String pCredential)
                                  throws Exception {
                      
                              Hashtable<String, String> props =
                                      getInitialContextProperties (pPrincipal, pCredential);
                              securedInitialContext = new InitialContext (props);
                              return securedInitialContext;
                          }
                      
                          /**
                           * Return the default InitialContext based on org.jnp.interfaces.LocalOnlyContextFactory
                           * if one is already instantiated, otherwise create a new InitialContext and set as the default.
                           *
                           * @return javax.naming.InitialContext
                           * @throws javax.naming.NamingException
                           */
                          public static InitialContext loadInitialContext ()
                                  throws NamingException {
                      
                              if (initialContext == null) {
                                  Hashtable<String, String> props = getInitialContextProperties ();
                                  initialContext = new InitialContext (props);
                              }
                              return initialContext;
                          }
                      
                          /**
                           * Return the default InitialContext based on org.jboss.security.jndi.JndiLoginInitialContextFactory
                           * if one is already instantiated, otherwise create a new InitialContext and set as the default.
                           * Use the specified username and password to set the security context.
                           *
                           * @param pPrincipal
                           * @param pCredential
                           * @return
                           * @throws javax.naming.NamingException
                           */
                          public InitialContext loadInitialContext (final String pPrincipal,
                                                                    final String pCredential)
                                  throws NamingException {
                      
                              if (securedInitialContext == null) {
                                  Hashtable<String, String> props =
                                          getInitialContextProperties (pPrincipal, pCredential);
                                  securedInitialContext = new InitialContext (props);
                              }
                              return securedInitialContext;
                          }
                      
                          private static Hashtable<String, String> getInitialContextProperties () {
                      
                              Hashtable<String, String> props = new Hashtable<String, String> (1);
                              props.put (Context.INITIAL_CONTEXT_FACTORY,
                                         "org.apache.openejb.client.LocalInitialContextFactory");
                      
                              return props;
                          }
                      
                          private Hashtable<String, String> getInitialContextProperties (final String pPrincipal,
                                                                                         final String pCredential) {
                      
                              Hashtable<String, String> props = getInitialContextProperties ();
                              props.put (Context.SECURITY_PRINCIPAL, pPrincipal);
                              props.put (Context.SECURITY_CREDENTIALS, pCredential);
                              return props;
                          }
                      }




                      public class OpenEjbBootstrap {
                      
                          public void startAndDeployResources ()
                                  throws Exception {
                      
                              startAndDeployResources (null);
                          }
                      
                          public void startAndDeployResources (final Properties pProperties)
                                  throws Exception {
                      
                              try {
                                  String base = "target/test-classes";
                                  System.setProperty ("openejb.home", base);
                                  System.setProperty ("openejb.base", base);
                      
                                  Properties props = new Properties ();
                                  props.put ("openejb.jndiname.format", "{deploymentId}/{interfaceType.annotationName}");
                                  props.put ("openejb.configuration", base + "/openejb.xml");
                      
                                  if (pProperties != null) {
                                      props.putAll (pProperties);
                                  }
                      
                                  // DEBUG - print classpath
                                  /*
                                  ClassLoader sysClassLoader = ClassLoader.getSystemClassLoader ();
                                  URL[] urls = ((URLClassLoader) sysClassLoader).getURLs ();
                                  LoggingStaticService.info ("############################");
                                  LoggingStaticService.info ("CLASSPATH:");
                                  for (URL url : urls) {
                                      String prefix;
                                      String s = url.getFile ();
                                      if (s.endsWith (".jar")) {
                                          prefix = "JAR: ";
                                      } else {
                                          prefix = "DIR: ";
                                      }
                                      LoggingStaticService.info (prefix + s);
                                  }
                                  LoggingStaticService.info ("############################");
                                  */
                                  // DEBUG
                      
                                  OpenEJB.init (props);
                              }
                              catch (Exception ex) {
                                  LoggingStaticService.error (ex);
                                  throw new RuntimeException (ex);
                              }
                          }
                      
                          private boolean resourceExists (final String pName) {
                      
                              return Thread.currentThread ().getContextClassLoader ().getResource (pName) != null;
                          }
                      
                      }




                      @Name("org.jboss.seam.transaction.transaction_container")
                      @Scope(ScopeType.EVENT)
                      @Install(precedence = Install.MOCK)
                      @BypassInterceptors
                      public class MockTransaction
                              extends Transaction {
                      
                          public static String EJB_CONTEXT_NAME = "java:comp.ejb3/EJBContext";
                      
                          public static final String STANDARD_EJB_CONTEXT_NAME = "java:comp/EJBContext";
                      
                          @Override
                          protected org.jboss.seam.transaction.UserTransaction createCMTTransaction ()
                                  throws NamingException {
                      
                              return new CMTTransaction (getEJBContext ());
                          }
                      
                          public static EJBContext getEJBContext ()
                                  throws NamingException {
                      
                              try {
                                  return (EJBContext) BootstrapEnvironment.getStaticInitialContext ()
                                          .lookup (EJB_CONTEXT_NAME);
                              }
                              catch (NameNotFoundException nnfe) {
                                  return (EJBContext) BootstrapEnvironment.getStaticInitialContext ()
                                          .lookup (STANDARD_EJB_CONTEXT_NAME);
                              }
                          }
                      
                          @Override
                          protected UserTransaction getUserTransaction ()
                                  throws NamingException {
                      
                              InitialContext context = BootstrapEnvironment.getStaticInitialContext ();
                      
                              try {
                                  return (UserTransaction) context.lookup ("java:comp/UserTransaction");
                              }
                              catch (NameNotFoundException nnfe) {
                                  try {
                                      //Embedded JBoss has no java:comp/UserTransaction
                                      UserTransaction ut = (UserTransaction) context.lookup ("UserTransaction");
                                      ut.getStatus (); //for glassfish, which can return an unusable UT
                                      return ut;
                                  }
                                  catch (Exception e) {
                                      throw nnfe;
                                  }
                              }
                          }
                      }





                      @BypassInterceptors
                      public class ReallyNoTransaction
                              extends NoTransaction {
                      
                          @Override
                          public void begin () throws NotSupportedException, SystemException {
                      
                          }
                      
                          @Override
                          public void commit () throws RollbackException, HeuristicMixedException,
                                                       HeuristicRollbackException, SecurityException,
                                                       IllegalStateException, SystemException {
                      
                          }
                      
                          @Override
                          public int getStatus () throws SystemException {
                              return Status.STATUS_NO_TRANSACTION;
                          }
                      
                          @Override
                          public void rollback () throws IllegalStateException, SecurityException, SystemException {
                      
                          }
                      
                          @Override
                          public void setRollbackOnly () throws IllegalStateException, SystemException {
                      
                          }
                      
                          @Override
                          public void setTransactionTimeout (final int pTimeout) throws SystemException {
                      
                          }
                      
                          @Override
                          public void registerSynchronization (final Synchronization sync) {
                      
                          }
                      
                      }



                      A test template:


                      @Test(groups = "whitebox")
                      public class ExampleTest
                              extends ContainerWhiteBoxTest {
                      
                          // save --------------------------------------------------------------------------------------
                          public void should () throws Exception {
                      
                              new DBComponentTest() {
                      
                                  @Override
                                  protected void testDBComponents () throws Exception {
                                      // ...
                                  }
                              }.run ();
                          }
                      }



                      also I created a folder 'resources-ejb' next to my 'resources' in my maven structure. it contains:


                      ejb-jar.xml


                      <ejb-jar/>



                      openejb.xml


                      <?xml version="1.0"?>
                      <openejb/>



                      WEB-INF/web.xml


                      <?xml version="1.0" encoding="UTF-8"?>
                      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                               xmlns="http://java.sun.com/xml/ns/javaee"
                               xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
                               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
                               version="2.5">
                      
                          <listener>
                              <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
                          </listener>
                      
                          <filter>
                              <filter-name>Seam Filter</filter-name>
                              <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
                          </filter>
                      
                          <filter-mapping>
                              <filter-name>Seam Filter</filter-name>
                              <url-pattern>/*</url-pattern>
                          </filter-mapping>
                      
                      </web-app>



                      WEB-INF/components.xml


                      <?xml version="1.0" encoding="UTF-8"?>
                      <components xmlns="http://jboss.com/products/seam/components"
                                  xmlns:core="http://jboss.com/products/seam/core"
                                  xmlns:persistence="http://jboss.com/products/seam/persistence"
                                  xmlns:transaction="http://jboss.com/products/seam/transaction"
                                  xmlns:security="http://jboss.com/products/seam/security"
                                  xmlns:framework="http://jboss.com/products/seam/framework">
                      
                          <!-- #### -->
                          <!-- CORE -->
                          <!-- #### -->
                      
                          <core:init
                                  jndi-pattern="\#{ejbName}/local"
                                  debug="false" transaction-management-enabled="false"/>
                      
                          <component
                                  class="com.TODO.ReallyNoTransaction"
                                  name="org.jboss.seam.transaction.transaction" scope="event" precedence="30"/>
                      
                      
                          <!-- ############# -->
                          <!-- ENTITYMANAGER -->
                          <!-- ############# -->
                      
                          <!-- JPA -->
                          <transaction:no-transaction/>
                      
                          <persistence:entity-manager-factory
                                  name="containerPU"/>
                      
                          <persistence:managed-persistence-context
                                  name="em" auto-create="true" entity-manager-factory="#{containerPU}"/>
                      
                          <!-- ######## -->
                          <!-- SECURITY -->
                          <!-- ######## -->
                      
                          <security:jpa-identity-store
                                  user-class="com.TODO.entity.UserEntity"
                                  role-class="com.TODO.entity.UserRoleEntity"/>
                      
                          <security:jpa-permission-store
                                  user-permission-class="com.TODO.entity.UserPermissionEntity"/>
                      
                          <security:identity
                                  authenticate-method="#{TODO}"
                                  remember-me="false"/>
                      
                      </components>



                      and in my persistence.xml (unter resources/META-INF) I added to the existing PU:


                      <persistence-unit name="containerPU" transaction-type="RESOURCE_LOCAL">
                      
                              <provider>org.hibernate.ejb.HibernatePersistence</provider>
                      
                              <!--
                              <jta-data-source>java:openejb/Resource/Default JDBC Database</jta-data-source>
                              <non-jta-data-source>java:openejb/Resource/Default Unmanaged JDBC Database</non-jta-data-source>
                              -->
                      
                              <properties>
                                  <property name="hibernate.hbm2ddl.auto"
                                            value="create-drop"/>
                                  <property name="hibernate.connection.driver_class"
                                            value="org.h2.Driver"/>
                                  <property name="hibernate.connection.username"
                                            value="sa"/>
                                  <property name="hibernate.connection.password"
                                            value=""/>
                                  <property name="hibernate.connection.url"
                                            value="jdbc:h2:mem:mydb"/>
                                  <property name="hibernate.dialect"
                                            value="org.hibernate.dialect.H2Dialect"/>
                                  <property name="hibernate.connection.release_mode"
                                            value="after_transaction"/>
                                  <property name="hibernate.transaction.manager_lookup_class"
                                            value="org.apache.openejb.hibernate.TransactionManagerLookup"/>
                              </properties>
                      
                          </persistence-unit>



                      As a maven user of course I had to add 'resources-ejb' to the classpath:


                      <testResources>
                        <!-- needed for whitebox container tests: -->
                        <testResource>
                          <filtering>false</filtering>
                          <directory>${basedir}/src/test/resources-ejb</directory>
                        </testResource>
                      </testResources>



                      By the way - the openejb dependency looks like this:



                             <!-- OpenEJB Application Server -->
                              <dependency>
                                  <groupId>org.apache.openejb</groupId>
                                  <artifactId>openejb-core</artifactId>
                                  <version>3.1</version>
                                  <exclusions>
                                      <exclusion>
                                          <groupId>org.apache.openjpa</groupId>
                                          <artifactId>openjpa</artifactId>
                                      </exclusion>
                                      <exclusion>
                                          <groupId>hsqldb</groupId>
                                          <artifactId>hsqldb</artifactId>
                                      </exclusion>
                                      <exclusion>
                                          <groupId>junit</groupId>
                                          <artifactId>junit</artifactId>
                                      </exclusion>
                                  </exclusions>
                              </dependency>




                      I can't tell which files are really crucial and which are not - but I can tell you that this combination works for me :-)
                      Of course all credit goes to Olivier Thierry - I merely changed a few lines of code and added config files.


                      Hope it works for you!

                      • 8. Re: Using OpenEJB for integration testing
                        lpiccoli.lucio.asteriski.com


                        I can't tell which files are really crucial and which are not - but I can tell you that this combination works for me :-) Of course all credit goes to Olivier Thierry - I merely changed a few lines of code and added config files.

                        great detail!


                        i got heaps of dependencies issues that i am working thru to integrated openejb into my seam project.


                        what did u remove from the original seam-gen classpath? i assumed u removed all the jboss-embedded jars?
                        Did u also remove the 'bootstrap' folder?


                        -lp

                        • 9. Re: Using OpenEJB for integration testing
                          stephanos

                          well, I didn't use seam-gen to build the basis, I defined everything from scratch via maven


                          the jboss-embedded jars have to go of course, the bootstrap-folder too


                          I created a dependency tree from maven where you can see what dependencies I have (my project is scattered across various sub modules):


                           com.author:portal-web:war:0.0.4
                           +- javax.servlet:servlet-api:jar:2.5:provided (scope not updated to compile)
                           +- commons-digester:commons-digester:jar:1.8:compile
                           |  \- commons-beanutils:commons-beanutils:jar:1.7.0:compile
                           +- commons-logging:commons-logging:jar:1.1:compile
                           |  +- logkit:logkit:jar:1.0.1:compile
                           |  \- avalon-framework:avalon-framework:jar:4.1.3:compile
                           +- org.jboss.seam:jboss-seam-ui:jar:2.2.0.GA:runtime
                           |  \- org.jboss.seam:jboss-seam-jul:jar:2.2.0.GA:runtime
                           +- org.jboss.seam:jboss-seam-mail:jar:2.2.0.GA:runtime
                           +- org.jboss:jboss-faces:jar:4.2.3.GA:runtime
                           +- jboss:jboss-serialization:jar:4.2.2.GA:runtime
                           +- org.jboss.logging:jboss-logging-spi:jar:2.0.5.GA:runtime
                           +- trove:trove:jar:1.0.2:runtime
                           +- net.sourceforge.nekohtml:nekohtml:jar:1.9.9:runtime
                           |  \- xerces:xercesImpl:jar:2.8.1:runtime
                           +- org.mortbay.jetty:jetty-embedded:jar:6.1.19:provided
                           |  +- org.mortbay.jetty:jetty:jar:6.1.19:provided
                           |  |  +- org.mortbay.jetty:jetty-util:jar:6.1.19:provided
                           |  |  \- org.mortbay.jetty:servlet-api:jar:2.5-20081211:provided
                           |  \- javax.servlet.jsp:jsp-api:jar:2.1:provided
                           +- org.webcastellum:webcastellum:jar:1.8.2:system
                           +- com.author:portal-lib:jar:0.0.4:compile
                           |  +- org.jboss.seam:jboss-seam-resteasy:jar:2.2.0.GA:runtime
                           |  |  +- org.jboss.resteasy:resteasy-jaxrs:jar:1.1-RC2:runtime
                           |  |  |  \- org.jboss.resteasy:jaxrs-api:jar:1.1-RC2:runtime
                           |  |  +- org.jboss.resteasy:resteasy-jaxb-provider:jar:1.1-RC2:runtime
                           |  |  |  +- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.2:runtime
                           |  |  |  +- com.sun.xml.stream:sjsxp:jar:1.0.1:runtime
                           |  |  |  |  \- javax.xml.stream:stax-api:jar:1.0:runtime
                           |  |  |  \- org.codehaus.jettison:jettison:jar:1.0.1:runtime
                           |  |  \- org.jboss.resteasy:resteasy-atom-provider:jar:1.1-RC2:runtime
                           |  +- com.sunshock.portal:portal-users:jar:0.0.4:compile
                           |  |  \- com.sunshock.portal:portal-common:jar:0.0.4:compile
                           |  |     \- com.sunshock.portal:portal-generic:jar:0.0.4:compile
                           |  |        +- javax.faces:jsf-impl:jar:1.2_13:runtime
                           |  |        +- javax.faces:jsf-api:jar:1.2_13:compile
                           |  |        +- org.jboss.seam:jboss-seam:jar:2.2.0.GA:compile
                           |  |        |  +- xstream:xstream:jar:1.1.3:compile
                           |  |        |  +- xpp3:xpp3_min:jar:1.1.3.4.O:compile
                           |  |        |  \- org.jboss.el:jboss-el:jar:1.0_02.CR4:compile
                           |  |        +- javassist:javassist:jar:3.8.0.GA:compile
                           |  |        +- org.tuckey:urlrewritefilter:jar:3.1.0:compile
                           |  |        +- org.hibernate:hibernate-entitymanager:jar:3.4.0.GA:compile
                           |  |        |  +- org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile
                           |  |        |  +- org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile
                           |  |        |  +- org.hibernate:hibernate-core:jar:3.3.0.SP1:compile
                           |  |        |  |  \- antlr:antlr:jar:2.7.6:compile
                           |  |        |  +- org.slf4j:slf4j-api:jar:1.4.2:compile
                           |  |        |  +- dom4j:dom4j:jar:1.6.1:compile
                           |  |        |  |  \- xml-apis:xml-apis:jar:1.3.04:compile
                           |  |        |  \- javax.transaction:jta:jar:1.1:compile
                           |  |        +- org.hibernate:hibernate-validator:jar:3.1.0.GA:compile
                           |  |        +- org.hibernate:hibernate-c3p0:jar:3.3.2.GA:compile
                           |  |        |  \- c3p0:c3p0:jar:0.9.1:compile
                           |  |        +- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
                           |  |        +- net.sf.ehcache:ehcache:jar:1.5.0:compile
                           |  |        |  +- backport-util-concurrent:backport-util-concurrent:jar:2.1:compile
                           |  |        |  \- net.sf.jsr107cache:jsr107cache:jar:1.0:compile
                           |  |        +- org.hibernate:hibernate-ehcache:jar:3.3.1.GA:compile
                           |  |        +- org.hibernate:hibernate-tools:jar:3.2.4.GA:compile
                           |  |        |  +- org.beanshell:bsh:jar:2.0b4:compile
                           |  |        |  +- freemarker:freemarker:jar:2.3.8:compile
                           |  |        |  \- org.hibernate:jtidy:jar:r8-20060801:compile
                           |  |        +- org.jboss.envers:jboss-envers:jar:1.2.1.GA-hibernate-3.3:compile
                           |  |        +- org.apache.ant:ant:jar:1.7.0:compile
                           |  |        |  \- org.apache.ant:ant-launcher:jar:1.7.0:compile
                           |  |        +- org.slf4j:slf4j-log4j12:jar:1.5.2:runtime
                           |  |        |  \- log4j:log4j:jar:1.2.12:runtime
                           |  |        +- commons-lang:commons-lang:jar:2.4:compile
                           |  |        +- net.jawr:jawr:jar:2.7:runtime
                           |  |        \- org.opensymphony.quartz:quartz:jar:1.6.1:compile
                           |  +- com.author:integration:jar:0.0.4:compile
                           |  |  +- org.apache.httpcomponents:httpclient:jar:4.0:compile
                           |  |  |  +- org.apache.httpcomponents:httpcore:jar:4.0.1:compile
                           |  |  |  \- commons-codec:commons-codec:jar:1.3:compile
                           |  |  +- net.java.dev.jets3t:jets3t:jar:0.7.1:compile
                           |  |  |  \- commons-httpclient:commons-httpclient:jar:3.1:compile
                           |  |  +- com.sun.jersey:jersey-client:jar:1.1.1-ea:compile
                           |  |  |  \- com.sun.jersey:jersey-core:jar:1.1.1-ea:compile
                           |  |  |     \- javax.ws.rs:jsr311-api:jar:1.1:compile
                           |  |  +- com.sun.jersey:jersey-server:jar:1.1.1-ea:compile
                           |  |  |  \- asm:asm:jar:3.1:compile
                           |  |  \- com.sunshock.common:common-utilities:jar:0.0.4:compile
                           |  |     +- org.jasypt:jasypt:jar:1.5:compile
                           |  |     \- com.sunshock.common:common-generic:jar:0.0.4:compile
                           |  |        +- commons-io:commons-io:jar:1.4:compile
                           |  |        \- javax.persistence:persistence-api:jar:1.0:compile
                           |  +- org.richfaces.framework:richfaces-impl:jar:3.3.2.CR1:compile
                           |  +- org.richfaces.ui:richfaces-ui:jar:3.3.2.CR1:compile
                           |  +- org.richfaces.framework:richfaces-api:jar:3.3.2.CR1:compile
                           |  |  \- commons-collections:commons-collections:jar:3.2:compile
                           |  \- commons-fileupload:commons-fileupload:jar:1.2.1:compile
                           +- de.odysseus.juel:juel:jar:2.1.0:test
                           +- com.sunshock.portal:portal-test-container:jar:0.0.4:test
                           |  +- com.sunshock.portal:portal-test:jar:0.0.4:test
                           |  |  +- com.sunshock.common:common-test:jar:0.0.4:test
                           |  |  |  +- org.testng:testng:jar:jdk15:5.9:test
                           |  |  |  +- jdepend:jdepend:jar:2.9.1:test
                           |  |  |  +- org.mockito:mockito-all:jar:1.8.0:test
                           |  |  |  \- fest:fest-assert:jar:1.1a1:test
                           |  |  |     \- fest:fest-util:jar:1.0:test
                           |  |  \- com.h2database:h2:jar:1.1.117:test
                           |  +- org.glassfish.embedded:glassfish-embedded-all:jar:3.0-Prelude-Embedded-b14:test
                           |  \- org.apache.openejb:openejb-core:jar:3.1:test
                           |     +- org.apache.openejb:javaee-api:jar:5.0-1:test
                           |     +- org.apache.openejb:ejb31-api-experimental:jar:3.1:test
                           |     +- org.apache.openejb:openejb-loader:jar:3.1:test
                           |     +- org.apache.openejb:openejb-javaagent:jar:3.1:test
                           |     +- org.apache.openejb:openejb-jee:jar:3.1:test
                           |     |  +- org.codehaus.woodstox:wstx-asl:jar:3.2.0:test
                           |     |  |  \- stax:stax-api:jar:1.0.1:test
                           |     |  \- com.sun.xml.bind:jaxb-impl:jar:2.0.5:test
                           |     +- commons-cli:commons-cli:jar:1.1:test
                           |     +- org.apache.activemq:activemq-ra:jar:4.1.1:test
                           |     +- org.apache.activemq:activemq-core:jar:4.1.1:test
                           |     |  \- org.apache.activemq:activeio-core:jar:3.0.0-incubator:test
                           |     +- net.sourceforge.serp:serp:jar:1.13.1:test
                           |     +- org.apache.geronimo.components:geronimo-connector:jar:2.1:test
                           |     +- org.apache.geronimo.components:geronimo-transaction:jar:2.1:test
                           |     +- org.objectweb.howl:howl:jar:1.0.1-1:test
                           |     +- org.apache.geronimo.javamail:geronimo-javamail_1.4_mail:jar:1.2:test
                           |     +- org.apache.xbean:xbean-reflect:jar:3.4.1:test
                           |     |  \- commons-logging:commons-logging-api:jar:1.1:test
                           |     +- org.apache.openejb:asm-finder:jar:3.1:test
                           |     +- org.apache.xbean:xbean-naming:jar:3.4.1:test
                           |     +- org.apache.openejb:commons-dbcp-all:jar:1.3-r699049:test
                           |     +- org.codehaus.swizzle:swizzle-stream:jar:1.0.1:test
                           |     \- wsdl4j:wsdl4j:jar:1.6.1:test
                           +- com.sunshock.portal:portal-test-ui:jar:0.0.4:test
                           |  +- org.openqa.selenium.webdriver:webdriver-htmlunit:jar:0.6.1039:test
                           |  |  +- org.openqa.selenium.webdriver:webdriver-common:jar:0.6.1039:test
                           |  |  \- net.sourceforge.htmlunit:htmlunit:jar:2.5:test
                           |  |     +- xalan:xalan:jar:2.7.1:test
                           |  |     |  \- xalan:serializer:jar:2.7.1:test
                           |  |     +- net.sourceforge.htmlunit:htmlunit-core-js:jar:2.5:test
                           |  |     \- net.sourceforge.cssparser:cssparser:jar:0.9.5:test
                           |  |        \- org.w3c.css:sac:jar:1.3:test
                           |  +- org.openqa.selenium.webdriver:webdriver-firefox:jar:0.6.1039:test
                           |  |  \- org.json:json:jar:20080701:test
                           |  \- org.openqa.selenium.webdriver:webdriver-support:jar:0.6.1039:test
                           |     \- org.hamcrest:hamcrest-all:jar:1.1:test
                           +- org.jvnet.mock-javamail:mock-javamail:jar:1.7:compile
                           |  +- javax.mail:mail:jar:1.4:compile
                           |  |  \- javax.activation:activation:jar:1.1:compile
                           |  \- junit:junit:jar:3.8:compile
                           +- hsqldb:hsqldb:jar:1.8.0.7:compile
                           \- org.jboss.seam:jboss-seam-debug:jar:2.2.0.GA:compile
                              \- com.sun.facelets:jsf-facelets:jar:1.1.15.B1:compile



                          Many of it is probably not relevant for you - but the 'org.apache.openejb:openejb-core:jar:3.1:test'-part might be.

                          • 10. Re: Using OpenEJB for integration testing
                            tiagoaugusto

                            Hi guys, i am facing the same problem with my testNG. i am following the instruction you gave, and it works almost fine :).


                            My only problema is the fact that, when i run my install with test my persistence.xml must have diferente jndi name, one for the tomcat and another to the openEJB. So i have to disable the test when i run install for development phase, and enable test for a deply with test, Did you have the same issue?

                            • 11. Re: Using OpenEJB for integration testing
                              stephanos

                              I'm sorry - as you can see the posts are over 1 year old. I didn't manage to get it right, the project is long gone and I'm now on the Spring stack.


                              But good luck! :)