`
jason823
  • 浏览: 33523 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

Using embedded-jboss for unit testing

阅读更多
You can read and download the embedded-jboss from here: http://wiki.jboss.org/wiki/EmbeddedJBoss.
Using the embedded-jboss could contribute to the benefits that we can get the core functionalities of jboss from a very short deployment time(4~5s) for our unit testing.
Basing on that, we can obtain the resources of application storage such as hibernate sessions as same as the way in the web application, even, we can use the very same config files(in web application) of the storage persistence without any modification on them like *.cfg.xml and *-ds.xml
 
All we should do to make it work like this:
1. Add all jar files in "%Project%\embedded-jboss\lib" in your classpath.
2. Add all things under the directory "%Project%\embedded-jboss\bootstrap\" in your classpath too. I suggest that you can set the folder bootstrap as a source root folder in your ide.
3. Add the resource files in your classpath too, such as *.cfg.xml, *ds.xml, etc.
4. Create a file named persistence.xml under "META-INF\", also this folder should be added in your classpath.
5. Write a unit test class;
All done! You can use this sessions for you testing now.
 
PS:
1. I use EntityManager from Hibernate persistence in unit tests, it is defined in META-INF\persistence.xml like this:
<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="EntityManagerFactory1">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:/DS1</jta-data-source>
    <properties>
        <property name="jboss.entity.manager.factory.jndi.name"
                  value="java:/EntityManagerFactories/EntityManagerFactory1"/>
        <property name="hibernate.ejb.cfgfile" value="foo1.cfg.xml"/>
    </properties>
</persistence-unit>

<persistence-unit name="EntityManagerFactory2">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:/DS2</jta-data-source>
    <properties>
        <property name="jboss.entity.manager.factory.jndi.name"
                  value="java:/EntityManagerFactories/EntityManagerFactory2"/>
        <property name="hibernate.ejb.cfgfile" value="foo2.cfg.xml"/>
    </properties>
</persistence-unit>

...

</persistence>
  
 
2. Start embedded-jboss is very simply like this:
Bootstrap.getInstance().bootstrap();
Bootstrap.getInstance().deployResourceBase("foo-ds.xml");
Your datasources(java:/DS1 and java:/DS2) should be defined in the file foo-ds.xml following the template of Jboss.
 
Shutdown embedded-jboss 
Bootstrap.getInstance().shutdown();
  
After depolying embedded-jboss, you can get EntityFactory like this:
(HibernateEntityManagerFactory)Persistence.createEntityManagerFactor("EntityManagerFactory1");
(HibernateEntityManagerFactory)Persistence.createEntityManagerFactor("EntityManagerFactory2");
    ...
  
Then you can get hibernate session using these EntityManagerFactories.
 
3. TestNG is a little bit different from JUnit, but it's more easier to be used especially when you are testing a group of tests(it is called TestSuit in JUnit). Here is an example:
import org.hibernate.ejb.HibernateEntityManagerFactory;
import org.jboss.embedded.Bootstrap;
import org.jboss.deployers.spi.DeploymentException;

import javax.persistence.Persistence;

public class TestDeployer {
    static boolean isRunning = false;

    static HibernateEntityManagerFactory entityManagerFactory1;
    static HibernateEntityManagerFactory entityManagerFactory2;

    static void deploy() throws DeploymentException {
        Bootstrap.getInstance().bootstrap();
        Bootstrap.getInstance().deployResourceBase("foo-ds.xml");
        entityManagerFactory1= (HibernateEntityManagerFactory) Persistence.createEntityManagerFactory("EntityManagerFactory1");
        entityManagerFactory2= (HibernateEntityManagerFactory) Persistence.createEntityManagerFactory("EntityManagerFactory2");
    }

    static void unDeploy() throws DeploymentException {
        try {
            entityManagerFactory1.close();
            entityManagerFactory2.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        Bootstrap.getInstance().shutdown();
    }

}
 
import org.hibernate.Session;
import org.jboss.deployers.spi.DeploymentException;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;

/**
 * A simply test base class using TestNG
 * Our unit tests should be grouped by given names such as "beans", "entites", etc.
 * We can run a group of unit tests which belong the same group.
 * The running of a group can invoke a prepared method one time before the first test in it, such as the method "setUp" here.
 * The running of a group can invoke a finished method one time after all of the tests in it, such as the method "destroy" here.
 * The running of a group can invoke a method several times after each class in which group finishing all of its test methods, such as the method "closeSessions" here.
 */
public class TestBase {
    private Session session1;
    private Session session2;

    @BeforeGroups(groups = {"beans", "entities"})
    public void setUp() throws DeploymentException {
        TestDeployer.deploy();
    }

    @AfterGroups(groups = {"beans", "entities"})
    public void destroy() throws DeploymentException {
        TestDeployer.unDeploy();
    }

    @AfterClass(dependsOnGroups = {"beans", "entities"})
    public void closeSessions() {
        if (this.session1!= null)
            this.session1.close();
        if (this.session2!= null)
            this.session2.close();
    }

    protected Session getSession1() {
        if (this.session1== null || !this.session1.isOpen()) {
            this.session1= TestDeployer.entityManagerFactory1.getSessionFactory().openSession();
        }
        return this.session1;
    }

    protected Session getSession2() {
        if (this.session2== null || !this.session2.isOpen()) {
            this.session2= TestDeployer.entityManagerFactory2.getSessionFactory().openSession();
        }
        return this.session1;
    }
}
 
 
 
4.There are something records about the changes I made on embedded-jboss
   1). The embedded-jboss supports these features:
        
JNDI (remoteable) 
JCA 
-ds.xml files (connection pooling) 
JBoss Security 
(removed)EJB 3.0 (remoteable) 
(removed)JBoss Messaging 
(removed)JMX mbeans (-service.xml files) 
(removed)MC beans (-beans.xml files) 
(removed)JBoss TS
 
   2). I removed the features marked by "(removed)" above, for one thing, to speed up embedded-jboss on deploying, for another, there aresome errors after opening all features, they might be related with Seam and the Ejb feature is too complex for me to figure these errors out. But it is necessary to make clear about it because I can do unit test on features of Seam since I can't do it now!

   3). My changs on embedded-jboss(current version is beta3):   
a. Removed these files under "bootstrap\deploy":  all files except "jboss-local-jdbc.rar" 
b. Removed these files under "bootstrap\deployers": all files except "jca-deployers-beans.xml" and "security-deployer-beans.xml" 
c. Added file "standardjbosscmp-jdbc.xml"(getting from jboss-4.2.0.GA) into "bootstrap" 
d. Modified file "bootstrap\conf\jboss-service.xml", added these codes into the last:
<mbean code="org.jboss.ejb.plugins.cmp.jdbc.metadata.MetaDataLibrary" name="jboss.jdbc:service=metadata"/>
The -ds.xml file could take effect only after doing item c and d.     
 
5. At present, I just have taken these features: JNDI, JCA, DS file supporting and Security from embedded jboss, after all, they are same as in web application actually. 
     
6. What I have recorded here are just some tips, you should get details from official documents.      
   
7. 公司的Wiki只让发布英文的,所以就直接粘过来了,见谅。
分享到:
评论
1 楼 polygoncell 2008-06-26  
内容不错。

相关推荐

    QtEmbedded-4.8.5-arm.zip

    《QtEmbedded-4.8.5-arm.zip:深入探索Ubuntu下的Qt ARM编译环境》 在软件开发领域,Qt是一个广泛使用的跨平台应用程序框架,它允许开发者构建功能丰富的图形用户界面,支持多种操作系统,包括Linux、Windows、Mac ...

    Qt-Embedded-5.7.0.tar.xz

    【Qt-Embedded-5.7.0.tar.xz】是一个针对嵌入式设备的Qt库版本,用于开发在各种嵌入式操作系统上运行的应用程序。Qt是一个强大的跨平台应用程序开发框架,支持C++语言,同时也提供了QML进行UI设计。在5.7.0这个版本...

    qt-embedded-linux-opensource-src-4.5.3.tar.gz 移植

    ### qt-embedded-linux-opensource-src-4.5.3.tar.gz 移植 #### 概述 本篇文章将详细介绍如何进行 `qt-embedded-linux-opensource-src-4.5.3.tar.gz` 的移植过程,包括环境搭建、配置、编译等步骤。此版本的 Qt 是...

    paho.mqtt.embedded-c-master.zip_MQTT编程_c mqtt linux_mqtt_paho mq

    标题中的“paho.mqtt.embedded-c-master.zip”是一个开源项目,主要针对MQTT协议的C语言实现,名为Paho MQTT Embedded C。Paho是IBM和Oracle发起的一个开源项目,旨在提供一组支持多种开放标准的消息传递协议(如...

    embedded-redis-0.6.jar

    &lt;!-- https://mvnrepository.com/artifact/com.orange.redis-embedded/embedded-redis --&gt; &lt;groupId&gt;com.orange.redis-embedded&lt;/groupId&gt; &lt;artifactId&gt;embedded-redis &lt;version&gt;0.6 &lt;/dependency&gt;

    qt-embedded-linux-opensource-src-4.5.2.tar.gz.part1(第一部分)

    qt-embedded-linux-opensource-src-4.5.2.tar.gz.part1(共两部分)

    paho.mqtt.embedded-c-master.zip

    Paho是IBM和Oracle共同发起的一个开源项目,提供了多种编程语言的客户端库,包括本文将要讨论的“paho.mqtt.embedded-c”,这是一个针对嵌入式系统的MQTT客户端实现。 标题中的“paho.mqtt.embedded-c-master.zip”...

    paho.mqtt.embedded-c-1.0.0

    # Eclipse Paho MQTT C/C++ client for Embedded platforms This repository contains the source code for the [Eclipse Paho](http://eclipse.org/paho) MQTT C/C++ client library for Embedded platorms.

    qt-embedded-2.3.0.tar.gz

    这个"qt-embedded-2.3.0.tar.gz"压缩包包含了Qt库的源代码,版本为2.3.0,适用于在Linux环境下开发嵌入式应用程序。Qt是一个强大的C++图形用户界面工具包,它提供了丰富的API,使得开发者可以创建出具有现代感、跨...

    qt-embedded-free-3.3.8b.tar.gz

    首先,你需要使用`tar -zxvf qt-embedded-free-3.3.8b.tar.gz`命令来解压文件,然后你将得到一个名为`qt-embedded-free-3.3.8b`的目录,里面包含源代码和其他相关文件。 在开发嵌入式应用时,QT Embedded Free ...

    qt-embedded-free-3.3.8.tar.bz2

    qt-embedded-free-3.3.8

    qt-embedded-2.3.10-free.tar.gz

    qt-embedded-2.3.10-free.tar.gz经过测试,压缩包完整

    qt-embedded-linux-opensource-src-4.5.3.tar.part3

    qt-embedded-linux-opensource-src-4.5.3.tar.part3

    qt-embedded-linux-opensource-src-4.5.2.tar.gz.part1(第二部分)

    qt-embedded-linux-opensource-src-4.5.2.tar.gz.part1(第二部分)

    atlas-driver-neo4j-embedded-0.8.1.jar

    atlas-driver-neo4j-embedded-0.8.1.jar

    qt-embedded-2.3.7

    qt-embedded-2.3.7qt-embedded-2.3.7qt-embedded-2.3.7

    移植qt-embedded-linux-opensource-src-4[1].5.3至mini2440(王安喜原创).

    ### 移植qt-embedded-linux-opensource-src-4.5.3至mini2440的知识点 #### 一、项目背景与目标 本篇原创文章由作者王安喜撰写,详细记录了将qt-embedded-linux-opensource-src-4.5.3移植到mini2440开发板上的全...

    qt-embedded-linux-opensource-src-4.5.2.tar.gz

    在给定的文件"qt-embedded-linux-opensource-src-4.5.2.tar.gz"中,我们获取的是QT针对嵌入式Linux系统的开源源代码,版本为4.5.2。 该压缩包包含的是一整套开发环境,允许开发者在Linux环境下构建和定制自己的...

    qt-embedded-2.3.1.tar.gz

    该压缩包“qt-embedded-2.3.1.tar.gz”包含了Qt Embedded 2.3.1的所有源代码、编译脚本、文档和可能的预编译库,使得开发者能够在其特定的嵌入式平台上进行部署和定制。`.tar.gz`文件是一种常见的Linux/Unix档案格式...

Global site tag (gtag.js) - Google Analytics