zoukankan      html  css  js  c++  java
  • 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. 关键点: 将需要进行的测试单元 独立出来 。

      

  • 相关阅读:
    tuntime error '55' file already open
    Visual Studio Team System 2008 Team Suite 中文版下载地址
    Windows7快捷键大全
    Thinkpad T61 on screen display 设置
    Hough变换,找直线
    多目标识别
    GALIL 数字运动控制器 应用编程指南(V1.0)
    VC调用MATLAB.
    OTSU求阈值程序
    什么是伺服电机?
  • 原文地址:https://www.cnblogs.com/coder-fang/p/6378329.html
Copyright © 2011-2022 走看看