J2EE之wildfly 实践7 --对EJB的单元测试
实践背景:
对数据库访问服务(DAS)的EJB进行单无测试
使用单元测试框架:arquillian+junit
基于 wildfly 实践3 --DAS服务开发 进行单元测试的补充
(转载请注明来源:cnblogs coder-fang)
- 在项目pom文件中加入相关依赖包,如下:
<!-- unit test --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.junit</groupId> <artifactId>arquillian-junit-container</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.protocol</groupId> <artifactId>arquillian-protocol-servlet</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.extension</groupId> <artifactId>arquillian-transaction-api</artifactId> <version>1.0.3.Final</version> </dependency>
- 在pom的project节点下,加入以下配置:
<profiles> <profile> <activation> <activeByDefault>true</activeByDefault> </activation> <id>arq-wildfly-remote</id> <dependencies> <dependency> <groupId>org.wildfly.arquillian</groupId> <artifactId>wildfly-arquillian-container-remote</artifactId> <version>2.0.2.Final</version> <scope>test</scope> </dependency> </dependencies> </profile> </profiles> <dependencyManagement> <dependencies> <dependency> <groupId>org.jboss.arquillian</groupId> <artifactId>arquillian-bom</artifactId> <version>1.1.5.Final</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
- 在项目src/test/resources目录下加入arquillian.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <arquillian xmlns="http://jboss.org/schema/arquillian" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd"> <defaultProtocol type="Servlet 3.0" /> <container qualifier="wildfly-remote" default="true"> <configuration> <property name="managementAddress">192.168.50.123</property> <property name="managementPort">9990</property> <property name="username">jboss</property> <property name="password">jboss</property> </configuration> </container> </arquillian>
注:在192.168.50.123的机器上运行的wildfly包含要访问的数据源,所以单元测试要连接此机器。
- 在项目 src/test/java中加入测试类代码如下:
@RunWith(Arquillian.class) public class SiteMgrTest { @Deployment public static Archive<?> createTestArchive() { System.out.println("deploy test"); return ShrinkWrap.create(WebArchive.class, "test.war") .addPackage(SiteManager.class.getPackage()) .addPackage(MsgException.class.getPackage()) .addPackage(Site.class.getPackage()) .addPackage(SiteDao.class.getPackage()) .addPackage(SiteManagerRemote.class.getPackage()) .addAsResource("META-INF/persistence.xml") .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") ; } @Inject SiteManager siteManager; @Test public void saveSiteSuccess() throws MsgException{ Long num1 = siteManager.listSites(1, 1, 10).getTotalRow(); Site st = new Site(); st.setAccount("jgtest1--saveok"); st.setPass("1122"); st.setSitename("test jg"); st.setType(1); st.setSitecode("test001"); siteManager.saveSite(st); Assert.assertEquals(siteManager.listSites(1, 1, 10).getTotalRow(),++num1); } @Test public void saveSiteTestFail() throws MsgException{ Site site = new Site(); site.setAccount("jgtest1"); site.setPass("1122"); site.setSitename("test jg"); site.setType(1); try { siteManager.saveSite(site); } catch (Exception e) { // TODO Auto-generated catch block Assert.assertTrue(e instanceof MsgException); return; } Assert.fail(); } }
注:其中的site为实体类,sitemanager可以理解为封装后DAO,其中sitemanager类必须包含@LocalBean注解。
- 直接运行测试,效果如下 :
- -----------------分割线-----------------------
- 当加入nosql的数据访问dao时,可能引起之前对关系型数据库的测试失败,则此时需要将测试单元独立出来,重构后的代码如下
- 在src/test/resources中加入test-persistence.xml,此文件只包含要测试的关系型数据库的unit。
- 创建数据库单元测试的抽象类,代码如下:
public class AbstractSqlTest { @Deployment public static Archive<?> createTestArchive() { System.out.println("deploy"); JavaArchive wArchive = ShrinkWrap.create(JavaArchive.class, "unittest.jar") //公共 .addClass(AbstractSqlTest.class) .addAsManifestResource("test-persistence.xml", ArchivePaths.create("persistence.xml")) .addPackage(MsgException.class.getPackage()) .addClass(QueryResult.class) .addClass(AbstractDao.class) .addClass(Site.class) .addClass(SiteManagerRemote.class) .addClass(SiteManager.class) .addClass(SiteDao.class) ; System.out.println(wArchive.toString(true)); return wArchive; } }
注:addClass或addPackage需包含所有测试所需要的类或包。
- 创建子测试类:
@RunWith(Arquillian.class) @Transactional(TransactionMode.ROLLBACK) public class SiteMgrTest extends AbstractSqlTest { @EJB SiteManager siteManager; @Test public void listSiteSuccess() throws MsgException { Assert.assertTrue(true); } @Test public void saveSiteTestFail() throws MsgException { Assert.fail(); } }
注:所有其它dao类的测试都继承抽象类,通过@EJB引入需要注入的DAO,即可对其进行测试
- 此时,运行单元测试,完全可以按照test-persistence.xml中配置的关系数据库进行测试。
- 关键点: 将需要进行的测试单元 独立出来 。