2008-04-25
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.
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:
2. Start embedded-jboss is very simply like this:
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
After depolying embedded-jboss, you can get EntityFactory like this:
Then you can get hibernate session using these EntityManagerFactories.
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只让发布英文的,所以就直接粘过来了,见谅。
评论
polygoncell
2008-06-26
楼主有没有写过TestNG测试啊,有没有使用AssembledContextFactory构建jar文件?
我刚好碰到问题,不知道你有没有这方面的经验,谢谢。
帖子见这里: http://www.javaeye.com/topic/208354
我刚好碰到问题,不知道你有没有这方面的经验,谢谢。
帖子见这里: http://www.javaeye.com/topic/208354
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 5420 次
- 性别:


- 详细资料
搜索本博客
最近加入圈子
最新评论
-
Using embedded-jboss for ...
楼主有没有写过TestNG测试啊,有没有使用AssembledContextFa ...
-- by polygoncell -
Heritrix使用的初步总结
很奇怪运行起来之后,Modules下各种预设置没有修改项出来。
-- by pzhifeng -
Heritrix使用的初步总结
选择"Modules"右边的"Submodules 这个Submodules能不 ...
-- by liu_xingjian -
Heritrix使用的初步总结
正在学习怎么把抓取的内容跟lucene结合使用
-- by suyejun -
Heritrix使用的初步总结
Heritrix其实并没有我想像中那么强大和好用,提供的功能没有nutch多,有 ...
-- by johnnyhg






评论排行榜