2011-03-11 69 views
1

我想测试一个注入了另一个EJB的EJB。 为了测试目的,我想为注入的EJB使用存根。我使用openEJB作为EJB的框架进行测试。用stub和openejb框架测试ejb

这里是EJB:

@Stateless 
@Local(IService.class) 
public class Service implements IService { 

    @EJB 
    private IBean bean; 

    @Override 
    public String doService(String data) { 
     return bean.process(data); 
    } 
} 

真正注入EJB:

@Stateless 
@Local(IBean.class) 
public class Bean implements IBean { 

    private static Logger logger = Logger.getLogger(Bean.class); 

    @Override 
    public String process(String data) { 
     logger.info("Bean processing : " + data); 
     return "Bean processing : " + data; 
    } 
} 

的EJB的存根版本:

@Stateless 
@Local(IBean.class) 
public class BeanStub implements IBean { 

    private static Logger logger = Logger.getLogger(BeanStub.class); 

    @Override 
    public String process(String data) { 
     logger.info("Stub processing : " + data); 
     return "Stub processing : " + data; 
    } 
} 

和JUnit测试中使用:

public class ServiceTest { 

    private static Logger logger = Logger.getLogger(ServiceTest.class); 

    private static InitialContext context; 

    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 
     // openEJB 
     Properties p = new Properties(); 
     p.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.LocalInitialContextFactory"); 
     p.put("openejb.altdd.prefix", "stub"); // use specific ejb-jar 
     p.put("openejb.descriptors.output", "true"); 

     context = new InitialContext(p); 
    } 

    @Test 
    public void testServiceStub() { 
     try { 
      IService service = (IService) context.lookup("ServiceStubLocal"); 
      assertNotNull(service); 
      String msg = service.doService("service"); 
      assertEquals("Stub processing : service", msg); 
     } catch (NamingException e) { 
      logger.error(e); 
      fail(e.getMessage()); 
     } 
    } 
} 

我曾试图存根一个覆盖使用真正的EJB的,使用特定的EJB-JAR(我想在我的服务使用“BeanStub”,而不是默认的“豆”):

<ejb-jar> 
    <enterprise-beans> 
    <session id="ServiceStub"> 
     <ejb-name>ServiceStub</ejb-name> 
     <ejb-class>tests.Service</ejb-class> 
     <ejb-local-ref> 
      <ejb-ref-name>tests.Service/bean</ejb-ref-name> 
      <ejb-link>BeanStub</ejb-link> 
     </ejb-local-ref> 
    </session>   
    </enterprise-beans> 
</ejb-jar> 

不幸的是我有EJB声明一个问题:

 
    Apache OpenEJB 3.1.4 build: 20101112-03:32 
http://openejb.apache.org/ 
17:14:29,225 INFO startup:70 - openejb.home = D:\Workspace_Java\tests\testejb 
17:14:29,225 INFO startup:70 - openejb.base = D:\Workspace_Java\tests\testejb 
17:14:29,350 INFO config:70 - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) 
17:14:29,350 INFO config:70 - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) 
17:14:29,381 INFO config:70 - Found EjbModule in classpath: D:\Workspace_Java\tests\testejb\target\test-classes 
17:14:29,412 INFO config:70 - Found EjbModule in classpath: D:\Workspace_Java\tests\testejb\target\classes 
17:14:29,428 INFO config:70 - Beginning load: D:\Workspace_Java\tests\testejb\target\test-classes 
17:14:29,428 INFO config:70 - AltDD ejb-jar.xml -> file:/D:/Workspace_Java/tests/testejb/target/test-classes/META-INF/stub.ejb-jar.xml 
17:14:29,850 INFO config:70 - Beginning load: D:\Workspace_Java\tests\testejb\target\classes 
17:14:29,850 INFO config:70 - AltDD ejb-jar.xml -> file:/D:/Workspace_Java/tests/testejb/target/classes/META-INF/stub.ejb-jar.xml 
17:14:29,850 INFO config:70 - Configuring enterprise application: classpath.ear 
17:14:29,912 INFO config:70 - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container) 
17:14:29,912 INFO config:70 - Auto-creating a container for bean ServiceStub: Container(type=STATELESS, id=Default Stateless Container) 
17:14:29,912 INFO options:70 - Using 'openejb.descriptors.output=true' 
17:14:29,912 INFO options:70 - Using 'openejb.descriptors.output=true' 
17:14:29,928 INFO config:70 - Dumping Generated ejb-jar.xml to: C:\TEMP\ejb-jar-6391test-classes.xml 
17:14:29,959 INFO config:70 - Dumping Generated openejb-jar.xml to: C:\TEMP\openejb-jar-6392test-classes.xml 
17:14:29,959 INFO options:70 - Using 'openejb.descriptors.output=true' 
17:14:29,959 INFO config:70 - Dumping Generated ejb-jar.xml to: C:\TEMP\ejb-jar-6393classes.xml 
17:14:29,975 INFO config:70 - Dumping Generated openejb-jar.xml to: C:\TEMP\openejb-jar-6394classes.xml 
17:14:30,006 INFO config:70 - Enterprise application "classpath.ear" loaded. 
17:14:30,084 INFO startup:70 - Assembling app: classpath.ear 
17:14:30,131 INFO startup:70 - Jndi(name=ServiceStubLocal) --> Ejb(deployment-id=ServiceStub) 
17:14:30,131 ERROR startup:46 - Jndi name could not be bound; it may be taken by another ejb. Jndi(name=openejb/Deployment/ServiceStub/tests.IService!Local) 
17:14:30,131 INFO startup:70 - Undeploying app: classpath.ear 
17:14:30,147 ERROR startup:50 - Application could not be deployed: classpath.ear 
org.apache.openejb.OpenEJBException: Creating application failed: classpath.ear: Unable to bind business local interface for deployment ServiceStub 
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:679) 
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:450) 

有什么不对的做法,或在路上写的EJB-JAR?

回答

0

你为什么不简单地使用像EasyMock或Mockito这样的模拟框架来测试它。您不需要任何部署描述符,EJB容器,JNDI查找等只是这种代码:

@Test 
public void testDoService() { 
    IBean mockBean = EasyMock.createMock(IBean.class); 
    mockBean.process("data"); 
    EasyMock.replay(mockBean); 

    Service serviceToTest = new Service(mockBean); 
    serviceTotest.doService("data"); 
    EasyMock.verify(mockBean); 
} 

而且肯定会跑得更快了。

+1

谢谢,对于像这样可以成为解决方案的简单案例,除了这只是一个显示问题之外,真正的案例要复杂得多,还涉及数据库访问和存根中更复杂的操作。 – Frederic 2011-03-13 08:00:03

1

我和OpenEJB有类似的问题和障碍。如果你需要为测试(需要测试的人)琢磨和嘲笑,那么我最终能够设法​​处理它(在David - OpenEJB联合创始人的大力帮助下)。在最新版本(3.1.4)中,OpenEJB非常像Arquillian,它允许使用内部类测试驱动程序,而不需要ejb-jar.xml和类路径扫描。

我在这里描述过我的障碍:http://jakub.marchwicki.pl/posts/2011/07/01/testing-ejb-application-openejb-without-classpath-scanning/。看看,也许这会让你的测试更容易。

+0

URL返回404 – Jasper 2014-09-26 11:43:08

+0

对不起,它已重新联机。我在移动博客的过程中非常懒惰,并且并非所有文章都恢复在线。 – 2014-11-01 22:55:38

+0

链接已损坏。 – Keppil 2016-07-08 12:27:40