OpenEJB ApplicationComposer is an old but very efficient way to test EE code. The idea is almost the same as with ShrinkWrap and Arquillian but with a big difference: it is performance oriented and embedded only. As a quick reminder to use the ApplicationComposer (either the JUnit runner or the abstract TestNG class) you just define a test class with a set of @Module methods declaring the in memory EE model (WebApp for web.xml, Beans for beans.xml, EjbJar for openejb-jar.xml, @Classes for scanned classes…) and standard @Test methods. Of course injections work in the test class. For instance:
@RunWith(ApplicationComposer.class) public class MyTest { @Module public EjbJar application() throws Exception { return new EjbJar() .enterpriseBean( new SingletonBean(MyBean.class).localBean()); } @EJB private MyBean bean; @Test public void myTest() { assertEquals("test", bean.myMethod()); } }
That’s great but CDI extension mecanism still relies on classloader and since you use test classloader (Application loader) you’ll get into the test all available extensions…even web extensions you don’t want for your test for instance.
To avoid it ApplicationComposer got @CdiExtensions annotation. You put it on the class and list the extensions you want to take into account for the test:
@CdiExtensions({ MyExten.class, MyExt2.class }) @RunWith(ApplicationComposer.class) public class MyTest2 { // ... }
This is really useful when you rely on extensions which don’t work in embedded mode (web extension typically).
The other advantage to do it is to be able to test few CDI extensions without having to register them (META-INF/services/javax.enterprise.inject.spi.Extension is optional with this feature). This last feature is really useful when you extend abstract extensions.