| = Other Testing Techniques |
| :jbake-date: 2016-03-16 |
| :jbake-type: page |
| :jbake-status: published |
| :jbake-tomeepdf: |
| |
| === EJBContainer |
| |
| The `EJBContainer` API is a JavaEE API enriched by some OpenEJB features to make the testing easier. |
| |
| It starts a container (embedded for case we are interested in) scanning the classpath. This operation can be |
| slow and if you go with this solution maybe think to start it only once for all tests. |
| |
| ==== Sample |
| |
| [source,java] |
| ---- |
| import org.junit.After; |
| import org.junit.AfterClass; |
| import org.junit.Before; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| |
| import javax.ejb.embeddable.EJBContainer; |
| import javax.inject.Inject; |
| import javax.naming.NamingException; |
| |
| import static org.junit.Assert.assertTrue; |
| |
| public class ATest { |
| @Inject |
| private MyCDIBean aBean; |
| |
| @PersistenceContext |
| private EntityManager em; |
| |
| @Resource |
| private DataSource ds; |
| |
| @BeforeClass |
| public static void start() throws NamingException { |
| container = EJBContainer.createEJBContainer(); |
| } |
| |
| @AfterClass |
| public static void shutdown() { |
| if (container != null) { |
| container.close(); |
| } |
| } |
| |
| @Before |
| public void inject() throws NamingException { |
| container.getContext().bind("inject", this); |
| } |
| |
| @After |
| public void reset() throws NamingException { |
| container.getContext().unbind("inject"); |
| } |
| |
| @Test |
| public void aTest() { |
| // ... |
| } |
| } |
| ---- |
| |
| It will use `createEJBContainer()` method to start the container and application, and `close()` to shutdown it. |
| |
| OpenEJB provides the `bind("inject")` hack to be able to get injection in the test class. |
| |
| === OpenEJB JUnit |
| |
| `openejb-junit` is another artifact providing some facilities for testing. |
| |
| ==== EJBContainer Rule |
| |
| [source,java] |
| ---- |
| @Properties({ |
| @Property(key = DeploymentFilterable.CLASSPATH_EXCLUDE, value = "jar:.*"), |
| @Property(key = DeploymentFilterable.CLASSPATH_INCLUDE, value = ".*openejb-junit.*") |
| }) |
| public class TestEJBContainerDefaultConfig { |
| @Rule |
| public final EJBContainerRule containerRule = new EJBContainerRule(this); |
| |
| @org.apache.openejb.junit.jee.resources.TestResource |
| private Context ctx; |
| |
| @org.apache.openejb.junit.jee.resources.TestResource |
| private java.util.Properties props; |
| |
| @org.apache.openejb.junit.jee.resources.TestResource |
| private EJBContainer container; |
| |
| |
| @Test |
| public void configIsHere() { |
| // ... |
| } |
| } |
| |
| ---- |
| |
| TIP: there is the equivalent runner: `@RunWith(EJBContainerRunner.class)` |
| |
| ==== InjectRule: injections for EJBContainerRule |
| |
| [source,java] |
| ---- |
| @Properties({ |
| @Property(key = DeploymentFilterable.CLASSPATH_EXCLUDE, value = "jar:.*"), |
| @Property(key = DeploymentFilterable.CLASSPATH_INCLUDE, value = ".*myjar.*") |
| }) |
| public class TestEJBContainerRule { |
| @ClassRule |
| public static final EJBContainerRule CONTAINER_RULE = new EJBContainerRule(); |
| |
| @Rule |
| public final InjectRule injectRule = new InjectRule(this, CONTAINER_RULE); |
| |
| @EJB |
| private BasicEjbLocal ejb; |
| |
| @Test |
| public void aTest() { |
| // ... |
| } |
| } |
| ---- |
| |
| TIP: an alternative in `openejb-core` is to use `org.apache.openejb.Injector.inject(instance)` |