我希望有一個JUnit(或其他)系統,可以在模擬環境中測試企業bean,以便所有資源/ bean和等等注入本地。企業bean不應該做到這一點。應該支持各種注射。什麼是單元測試EJB3組件的最佳方式,而無需部署組件
- 我想爲此有一個maven插件,以便測試可以從maven版本運行。
- 在單元測試期間不需要進行交易,這將需要一個完整的 容器。
你知道這樣的maven插件或測試框架嗎?有經驗嗎?此
我希望有一個JUnit(或其他)系統,可以在模擬環境中測試企業bean,以便所有資源/ bean和等等注入本地。企業bean不應該做到這一點。應該支持各種注射。什麼是單元測試EJB3組件的最佳方式,而無需部署組件
你知道這樣的maven插件或測試框架嗎?有經驗嗎?此
不一定是最簡單的方法,但我設法從Java Persistence with Hibernate
得到這個工作使用JBoss的嵌入式EJB3.0容器,與主要援助一開始,我不知道Maven插件的/依賴,所以我不得不在本地安裝我自己:
(1)下載jboss-EJB-3.0_Embeddable_ALPHA_9.zip
從downloads
(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>
(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.xml
和persistence.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.
}
讓剛剛說有一個在這種方法中一路走來的絆腳石數量。
值得注意的是依賴關係的順序。
祝你好運!
我必須警告JBoss嵌入式是一團糟。你不需要相信我的話。爲自己查看論壇。這是所有可能的手段。事情現在可能對你有用,但是誰知道什麼bug仍然在那裏等待......假設你的項目會活很長時間..這是一種風險。
你可以試試OpenEJB。在某些方面(靈活性方面)是有限的,但它非常易於使用,並完全符合規範。有幾個鏈接,如this和this。下載並嘗試一下。順便說一句,OpenEJB通過閱讀JBoss嵌入式論壇的帖子來引起我的注意......來自憤怒的用戶指出替代方案。
就我個人而言,我決定爲我的項目創建一種模擬容器,它允許我測試幾乎所需的任何東西。對於持久性,我使用Hibernate Entity Manager + HSQL。我花了一個星期的時間來實施,但我的團隊(到目前爲止2個)都非常滿意。如果可能的話,我會盡量開源。
最後一個選項是ejb3unit。
要做單元測試,應該在容器外側做? – 2010-11-21 18:52:16
這些都不能在jbossAS7上運行。似乎這本書現在已經過時了。你知道如何使它在JBoss AS 7上運行嗎?具體來說,我無法找到任何替代`EJB3StandaloneBootstrap.deployXmlResource` – linuxeasy 2013-01-07 06:41:54