J2EE之wildfly 实践7 --对EJB的单元测试

实践背景:

对数据库访问服务(DAS)的EJB进行单无测试

使用单元测试框架:arquillian+junit

基于 wildfly 实践3 --DAS服务开发 进行单元测试的补充

 (转载请注明来源:cnblogs coder-fang)

 

  1. 在项目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>
    View Code

     

  2. 在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>
    View Code

     

  3. 在项目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>
    View Code

    注:在192.168.50.123的机器上运行的wildfly包含要访问的数据源,所以单元测试要连接此机器。

  4. 在项目 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();
            
        }
    }
    View Code

    注:其中的site为实体类,sitemanager可以理解为封装后DAO,其中sitemanager类必须包含@LocalBean注解。

  5. 直接运行测试,效果如下 :

 

  •   -----------------分割线-----------------------
  •  当加入nosql的数据访问dao时,可能引起之前对关系型数据库的测试失败,则此时需要将测试单元独立出来,重构后的代码如下
  1.   在src/test/resources中加入test-persistence.xml,此文件只包含要测试的关系型数据库的unit。
  2. 创建数据库单元测试的抽象类,代码如下:
    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;                                                     
        }
        
    }
    View Code

    注:addClass或addPackage需包含所有测试所需要的类或包。

  3. 创建子测试类:
    @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();
        }
    }
    View Code

    注:所有其它dao类的测试都继承抽象类,通过@EJB引入需要注入的DAO,即可对其进行测试

     
  4. 此时,运行单元测试,完全可以按照test-persistence.xml中配置的关系数据库进行测试。
  5. 关键点: 将需要进行的测试单元 独立出来 。

  

posted @ 2017-02-08 15:16  Coder_fang  阅读(1061)  评论(2编辑  收藏  举报