I was struggling yesterday to find a way to do Junit test for EJB and I found OpenEJB. But the configuration gave me errors. So I thought to write a complete example because I couldn't find it anywhere.
First lets create a simple ejb.
First lets create a simple ejb.
Here is the interface package com.imesh.testejb; import javax.ejb.Local; @Local public interface IHello { public string sayHi(); }OK now the bean class.
package com.imesh.testejb; import javax.ejb.Stateless; /** * Session Bean implementation class Hello */ @Stateless public class HelloBean implements IHello{ /** * Default constructor. */ public HelloBean() { } @Override public string sayHi() { return "HI"; } }Write our unit test class.package com.imesh.test.ejbtest;import static org.junit.Assert.*;import java.util.Properties;import javax.ejb.EJB;import javax.naming.InitialContext;import org.apache.openejb.api.LocalClient;import org.junit.After;import org.junit.Before;import org.junit.Test;@LocalClientpublic class HelloBeanTest { @Before public void setUp() throws Exception { Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
properties.setProperty("openejb.deployments.classpath.include", ".*");
initialContext = new InitialContext(properties); } @After public void tearDown() throws Exception { } @Test public void testSayHi() { bean = (IHello) initialContext.lookup("HelloBeanLocal"); assertEquals("Hi", bean.sayHi()); }
private InitialContext initialContext;
private IHello bean ;}Ok now we need ejb-jar.xml file which should be located in the META-INF folder.ejb-jar.xml contains nothing but j ust empty tag. I couldn't run the unit test without this xml but nobody mentioned about this xml in examples. The error I got is relate to the JNDI name not found. If you do use annotation in your ejb class, ejb-jar.xml will overwrite your annotation. So you can add this xml to test > resources > META-INF folder because we need this only for unit test. Next is dependencies. You may not want slf4j dependency. But I had some errors without it.
org.apache.openejb
openejb-core
3.1.3
test
org.slf4j
slf4j-nop
1.6.1
That's it. We are done. you can compile and run the unit test.