:index-group: Testing Techniques
:jbake-type: page
:jbake-status: status=published
= Alternate Descriptors

See the link:../../alternate-descriptors.html[Alternate Descriptors]
page for the full details of how this feature works.

For our example we’ll use the standard ``moviefun'' code which contains
a `Movie` entity and `Movies` session bean. To add a twist for testing
and demonstrate alternate descriptors, we will create an interceptor
that will be used only in our test cases.

To add this to our application, we simply need a `test.ejb-jar.xml` in
the same location that the regular `ejb-jar.xml` would be expected.

That gives us the following files in our project:

* src/main/resources/META-INF/ejb-jar.xml
* src/main/resources/META-INF/persistence.xml
* src/main/resources/META-INF/test.ejb-jar.xml

== The test.ejb-jar.xml

The normal `ejb-jar.xml` simply contains `<ejb-jar/>`, however the
`test.ejb-jar.xml` we add an extra interceptor:

[source,xml]
----
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee">
  <assembly-descriptor>
    <interceptor-binding>
      <ejb-name>Movies</ejb-name>
      <interceptor-class>org.superbiz.altdd.MoviesTest$Interceptor</interceptor-class>
    </interceptor-binding>
  </assembly-descriptor>
</ejb-jar>
----

== The TestCase

To enable our `test.ejb-jar.xml` in the test case, we simply set the
`openejb.altdd.prefix` property when creating the embedded
`EJBContainer`

[source,java]
----
 public class MoviesTest extends TestCase {

     @EJB
     private Movies movies;

     @Resource
     private UserTransaction userTransaction;

     @PersistenceContext
     private EntityManager entityManager;

     public void setUp() throws Exception {
         Properties p = new Properties();
         p.put("movieDatabase", "new://Resource?type=DataSource");
         p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
         p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");

         p.put("openejb.altdd.prefix", "test");

         EJBContainer.createEJBContainer(p).getContext().bind("inject", this);
     }

     public void test() throws Exception {

         userTransaction.begin();

         try {
             entityManager.persist(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992));
             entityManager.persist(new Movie("Joel Coen", "Fargo", 1996));
             entityManager.persist(new Movie("Joel Coen", "The Big Lebowski", 1998));

             List<Movie> list = movies.getMovies();
             assertEquals("List.size()", 3, list.size());

             for (Movie movie : list) {
                 movies.deleteMovie(movie);
             }

             assertEquals("Movies.getMovies()", 0, movies.getMovies().size());

         } finally {
             try {
                 userTransaction.commit();
                 fail("Transaction should have been rolled back");
             } catch (RollbackException e) {
                 // Good, we don't want to clean up the db
             }
         }
     }

     public static class Interceptor {

         @Resource
         private SessionContext sessionContext;

         @AroundInvoke
         public Object invoke(InvocationContext context) throws Exception {

             sessionContext.setRollbackOnly();

             return context.proceed();
         }
     }
 }
----

As noted in link:../../alternate-descriptors.html[the documentation],
several prefixes can be used at once.

== Running

[source,console]
----
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.superbiz.altdd.MoviesTest
Apache OpenEJB 4.0.0-beta-1    build: 20111002-04:06
http://tomee.apache.org/
INFO - openejb.home = /Users/dblevins/examples/alternate-descriptors
INFO - openejb.base = /Users/dblevins/examples/alternate-descriptors
INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
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=movieDatabase, type=Resource, provider-id=Default JDBC Database)
INFO - Found EjbModule in classpath: /Users/dblevins/examples/alternate-descriptors/target/classes
INFO - Beginning load: /Users/dblevins/examples/alternate-descriptors/target/classes
INFO - AltDD ejb-jar.xml -> file:/Users/dblevins/examples/alternate-descriptors/target/classes/META-INF/test.ejb-jar.xml
INFO - Configuring enterprise application: /Users/dblevins/examples/alternate-descriptors
WARN - Method 'lookup' is not available for 'javax.annotation.Resource'. Probably using an older Runtime.
INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container)
INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL, id=Default Stateful Container)
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
INFO - Auto-creating a container for bean org.superbiz.altdd.MoviesTest: Container(type=MANAGED, id=Default Managed Container)
INFO - Configuring PersistenceUnit(name=movie-unit)
INFO - Auto-creating a Resource with id 'movieDatabaseNonJta' of type 'DataSource for 'movie-unit'.
INFO - Configuring Service(id=movieDatabaseNonJta, type=Resource, provider-id=movieDatabase)
INFO - Adjusting PersistenceUnit movie-unit <non-jta-data-source> to Resource ID 'movieDatabaseNonJta' from 'movieDatabaseUnmanaged'
INFO - Enterprise application "/Users/dblevins/examples/alternate-descriptors" loaded.
INFO - Assembling app: /Users/dblevins/examples/alternate-descriptors
INFO - PersistenceUnit(name=movie-unit, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 411ms
INFO - Jndi(name="java:global/alternate-descriptors/Movies!org.superbiz.altdd.Movies")
INFO - Jndi(name="java:global/alternate-descriptors/Movies")
INFO - Jndi(name="java:global/EjbModule1893321675/org.superbiz.altdd.MoviesTest!org.superbiz.altdd.MoviesTest")
INFO - Jndi(name="java:global/EjbModule1893321675/org.superbiz.altdd.MoviesTest")
INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container)
INFO - Created Ejb(deployment-id=org.superbiz.altdd.MoviesTest, ejb-name=org.superbiz.altdd.MoviesTest, container=Default Managed Container)
INFO - Started Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container)
INFO - Started Ejb(deployment-id=org.superbiz.altdd.MoviesTest, ejb-name=org.superbiz.altdd.MoviesTest, container=Default Managed Container)
INFO - Deployed Application(path=/Users/dblevins/examples/alternate-descriptors)
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.569 sec

Results :

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

== Warning on Tooling

If you split your descriptors into separate directories, this support
will not work. Specifically, this will not work:

* src/main/resources/META-INF/ejb-jar.xml
* src/main/resources/META-INF/persistence.xml
* src/*test*/resources/META-INF/test.ejb-jar.xml

This support is *not* aware of any Maven, Gradle, Ant, IntelliJ,
NetBeans, Eclipse or other settings.
