2009-02-16 29 views
13

我希望有一個JUnit(或其他)系統,可以在模擬環境中測試企業bean,以便所有資源/ bean和等等注入本地。企業bean不應該做到這一點。應該支持各種注射。什麼是單元測試EJB3組件的最佳方式,而無需部署組件

  • 我想爲此有一個maven插件,以便測試可以從maven版本運行。
  • 在單元測試期間不需要進行交易,這將需要一個完整的 容器。

你知道這樣的maven插件或測試框架嗎?有經驗嗎?此

回答

12

不一定是最簡單的方法,但我設法從Java Persistence with Hibernate

得到這個工作使用JBoss的嵌入式EJB3.0容器,與主要援助一開始,我不知道Maven插件的/依賴,所以我不得不在本地安裝我自己:

(1)下載jboss-EJB-3.0_Embeddable_ALPHA_9.zipdownloads

(2)該壓縮文件包含兩個重要的JAR:

  • jboss-ejb3-all.jar
  • thirdparty-all.jar

(3)這些JAR安裝到本地存儲庫(而不是使用nkl自己的首字母):

mvn install:install-file \ 
    -Dfile=jboss-ejb3-all.jar \ 
    -DgroupId=nkl.jboss.embedded \ 
    -DartifactId=jboss-ejb3-all \ 
    -Dversion=3.0-alpha-9 

mvn install:install-file \ 
    -Dfile=thirdparty-all.jar \ 
    -DgroupId=nkl.jboss.embedded \ 
    -DartifactId=thirdparty-all \ 
    -Dversion=3.0-alpha-9 

(4)如果一切順利的話,你現在應該在你的本地倉庫中有兩個目錄。

(5)現在,添加以下依賴於你的pom.xml

<dependency> 
     <groupId>nkl.jboss.embedded</groupId> 
     <artifactId>jboss-ejb3-all</artifactId> 
     <version>3.0-alpha-9</version> 
    </dependency> 
    <dependency> 
     <groupId>nkl.jboss.embedded</groupId> 
     <artifactId>thirdparty-all</artifactId> 
     <version>3.0-alpha-9</version> 
    </dependency> 

(6)我還需要添加依賴關係HSQLDBSLF4J

(7)你需要從複製一些文件conf目錄中的zip文件到您項目的src/main/resources目錄中:

  • default.persistence.properties
  • ejb3-interceptors-aop.xml
  • embedded-jboss-beans.xml
  • jndi.properties

(8)我創建了src/main/resources/META-INF我自己beans.xmlpersistence.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd" xmlns="urn:jboss:bean-deployer"> 
    <bean name="messageDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> 
    <property name="jndiName">java:/messageDS</property> 
    <property name="driverClass">org.hsqldb.jdbcDriver 
    </property> 
    <property name="connectionURL">jdbc:hsqldb:test</property> 
    <property name="minSize">0</property> 
    <property name="maxSize">10</property> 
    <property name="blockingTimeout">1000</property> 
    <property name="idleTimeout">30000</property> 
    <property name="transactionManager"> 
     <inject bean="TransactionManager" /> 
    </property> 
    <property name="cachedConnectionManager"> 
     <inject bean="CachedConnectionManager" /> 
    </property> 
    <property name="initialContextProperties"> 
     <inject bean="InitialContextProperties" /> 
    </property> 
    </bean> 
    <bean name="messageDS" class="java.lang.Object"> 
    <constructor factoryMethod="getDatasource"> 
     <factory bean="messageDSBootstrap" /> 
    </constructor> 
    </bean> 
</deployment> 

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
    version="1.0"> 
    <persistence-unit name="jpa"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>java:/messageDS</jta-data-source> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <property name="hibernate.hbm2ddl.auto" value="create" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

(9)我創建了一個單元測試一樣以下使用here的附加信息。

package org.nkl; 

import java.io.File; 

import javax.naming.InitialContext; 

import org.jboss.ejb3.embedded.EJB3StandaloneBootstrap; 
import org.jboss.ejb3.embedded.EJB3StandaloneDeployer; 
import org.junit.Test; 
import org.nkl.model.MessageHandler; 

public class BasicTest { 

    @Test 
    public void testEjb() throws Exception { 
     EJB3StandaloneBootstrap.boot(null); 
     EJB3StandaloneBootstrap.deployXmlResource("META-INF/beans.xml"); 
     EJB3StandaloneDeployer deployer = EJB3StandaloneBootstrap 
       .createDeployer(); 

     deployer.getArchives().add(new File("target/classes").toURI().toURL()); 

     deployer.create(); 
     deployer.start(); 
     InitialContext context = new InitialContext(); 
     MessageHandler messageHandler = (MessageHandler) context 
       .lookup("MessageHandlerBean/local"); 
     messageHandler.saveMessages(); 
     messageHandler.showMessages(); 
     EJB3StandaloneBootstrap.shutdown(); 
    } 
} 

(10),它使用簡單的SLSB,如:

package org.nkl.ejb; 

import java.util.List; 

import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

import org.nkl.model.Message; 
import org.nkl.model.MessageHandler; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@Stateless 
public class MessageHandlerBean implements MessageHandler { 

    @PersistenceContext 
    private EntityManager em; 

    Logger logger = LoggerFactory.getLogger(MessageHandlerBean.class); 

    public void saveMessages() { 
     logger.info("In saveMessages"); 
     em.persist(new Message("Hello World")); 
    } 

    @SuppressWarnings("unchecked") 
    public void showMessages() { 
     logger.info("In showMessages"); 
     List messages = em.createQuery(
       "select m from Message m order by m.text asc").getResultList(); 
     for (Object o : messages) { 
      logger.info(((Message) o).getText()); 
     } 
    } 
} 

(11)和消息的實體類,如:

package org.nkl.model; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

@Entity 
@Table(name = "MESSAGES") 
public class Message { 
    @Id 
    @GeneratedValue 
    @Column(name = "MESSAGE_ID") 
    private Long id; 
    @Column(name = "MESSAGE_TEXT") 
    private String text; 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "NEXT_MESSAGE") 
    private Message nextMessage; 

    public Message(String text) { 
     this.text = text; 
    } 

    Message() {} 

    // setters/getters not shown. 

} 

讓剛剛說有一個在這種方法中一路走來的絆腳石數量。

值得注意的是依賴關係的順序。

祝你好運!

+1

要做單元測試,應該在容器外側做? – 2010-11-21 18:52:16

+0

這些都不能在jbossAS7上運行。似乎這本書現在已經過時了。你知道如何使它在JBoss AS 7上運行嗎?具體來說,我無法找到任何替代`EJB3StandaloneBootstrap.deployXmlResource` – linuxeasy 2013-01-07 06:41:54

4

我必須警告JBoss嵌入式是一團糟。你不需要相信我的話。爲自己查看論壇。這是所有可能的手段。事情現在可能對你有用,但是誰知道什麼bug仍然在那裏等待......假設你的項目會活很長時間..這是一種風險。

你可以試試OpenEJB。在某些方面(靈活性方面)是有限的,但它非常易於使用,並完全符合規範。有幾個鏈接,如thisthis。下載並嘗試一下。順便說一句,OpenEJB通過閱讀JBoss嵌入式論壇的帖子來引起我的注意......來自憤怒的用戶指出替代方案。

就我個人而言,我決定爲我的項目創建一種模擬容器,它允許我測試幾乎所需的任何東西。對於持久性,我使用Hibernate Entity Manager + HSQL。我花了一個星期的時間來實施,但我的團隊(到目前爲止2個)都非常滿意。如果可能的話,我會盡量開源。

最後一個選項是ejb3unit

相關問題