??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美精品在欧美一区二区少妇,日韩成人在线免费观看,欧美日韩亚洲一区二区三区http://www.aygfsteel.com/yangpingyu/category/48541.htmlzh-cnSat, 14 May 2011 09:55:04 GMTSat, 14 May 2011 09:55:04 GMT60grails学习Q二Qgrails单元试http://www.aygfsteel.com/yangpingyu/archive/2011/05/13/350200.htmlyangpingyuyangpingyuFri, 13 May 2011 13:40:00 GMThttp://www.aygfsteel.com/yangpingyu/archive/2011/05/13/350200.htmlhttp://www.aygfsteel.com/yangpingyu/comments/350200.htmlhttp://www.aygfsteel.com/yangpingyu/archive/2011/05/13/350200.html#Feedback0http://www.aygfsteel.com/yangpingyu/comments/commentRss/350200.htmlhttp://www.aygfsteel.com/yangpingyu/services/trackbacks/350200.html
软g的bug是无法避免,但是我们可以量减少bugQ不断提升代码质量。刚我也说过Q上q问题造成的原因是没有做测试。测试包括很多了Q单元测试、集成测试和功能试{等。既然测试如此重要,每完成一个类都能q行试?br />
以前也许你比较纠l,没有好的工具Q现在javaC֌非常z跃Q我们可以选择的太多太多了Qjunit4QjmockQmockitoQeasymockQTestNg{等。如果你用过grailsQ那么你更清楚,此类快速开发框架已l帮我们集成好了。用v来非常简单。所以今天我主要讲述下grails的单元测试?br />
假设需求:我们l每个用户分配工作,每个人都要完成两件事情,W一件事情:Ҏ自己的用户名q回Ƣ迎信息Q第二g事情Q根据自q地址q回国家地区?br />
详细设计

用户信息c:
package com.test.domian

class User {

    
int id
    String name
    String address
    
    
static constraints = {
    }
}

工作服务接口Q?br />
package com.test.services

class WorkService {

    
/**
     * Ҏ用户名返回欢q字W?br />      * 
@param userName
     * 
@return
     
*/
    def processWorkOne(String userName) {
    }
    
    
/**
     * Ҏ地址q回地区
     * 
@param address
     * 
@return
     
*/
    def processWorkTwo(String address){
    }
    
}

用户工作服务Q?br />
package com.test.services

import com.test.domian.User

class UserService {

    def workService
    
    def doWork() {
        
        def userList 
= User.list()
        userList.each {
            it.name 
= workService.processWorkOne(it.name)
            it.address 
= workService.processWorkTwo(it.address)
            
        }
    }
}

我们重点来看下测试类Q?br />
package com.test.services

import grails.test.*

import com.test.domian.User

class UserServiceTests extends GrailsUnitTestCase {
    
protected void setUp() {
        
super.setUp()
    }

    
protected void tearDown() {
        
super.tearDown()
    }

    
void testDoWork() {
        
        
//构造数据,cM于数据库存在三条记录
        def user1 = new User(id:1, name:"lucy", address:"hangzhou")
        def user2 
= new User(id:2, name:"lily", address:"wenzhou")
        def user3 
= new User(id:3, name:"lilei", address:"beijing")
        mockDomain User, [user1, user2, user3]
        
        
//mock WorkService接口的processWorkOneҎ和processWorkTwoҎ
        def workControl = mockFor(WorkService)
        def userCount 
= User.count()
        
while(userCount-- > 0){
            workControl.demand.processWorkOne(
1..1){String userName ->
                
return "hello world, " << userName
            }
            workControl.demand.processWorkTwo(
1..1){String address ->
                
return "location in " << address
            }
        }
        def workService 
= workControl.createMock()
        
        
//把构造好的workservice传给userservice
        UserService userService = new UserService()
        userService.workService 
= workService
        
        userService.doWork()
        
        def user4 
= User.findById(1)
        assertEquals 
"hello world, lucy", user4.name
        assertEquals 
"location in hangzhou", user4.address
    }
}

以下着重来具体说明Q?br /> 1?span style="color: #000000;">mockDomainҎ是构造数据,包括domaincȝ动态方法都可以使用Q比如:saveQ)QlistQ)Qfindby*Q){。代码中的User.count(); User.list();是因ؓ调用了mockDomainҎ才可以正怋用。如果是集成试的话Qgrails会帮我们构造好Q可以直接用。但q里是单元测试,所以需要自己mock?br />
2、mockForҎ是lWorkService构造一个对象,然后l?/span>workControl对象的demand代理创徏两个UserService中用?/span>processWorkOne?/span>processWorkTwoҎQ代码中用到?..1Q表Cmock对象只能调用q个Ҏ一ơ,Z么要循环三次讄processWorkOne?/span>processWorkTwoҎ呢?因ؓ我们在UserService是对三个对象分别q行调用处理q两件事情。也怽会想Q干嘛不直接?..3Q最调用一ơ,最多调用三ơ)。是的,我最开始也是这么来处理Q可是单元测试就是同不过?br /> 如果?/span>UserServicecM?/span>
workControl.demand.processWorkOne(1..1){String userName ->
      
return "hello world, " << userName
 }

Ҏ
workControl.demand.processWorkOne(1..3){String userName ->
      
return "hello world, " << userName
 }

然后?span style="color: #000000;">UserServiceTestscM的:

userList.each {
            it.name 
= workService.processWorkOne(it.name)
            it.address 
= workService.processWorkTwo(it.address)
}
Ҏ
userList.each {
            it.name 
= workService.processWorkOne(it.name)
           
it.name = workService.processWorkOne(it.name)
            it.name = workService.processWorkOne(it.name)
            it.address = workService.processWorkTwo(it.address)
}

单元试可以通过Q但是改成这?br /> userList.each {
            it.name 
= workService.processWorkOne(it.name)
           
it.name = workService.processWorkOne(it.name)
            it.address = workService.processWorkTwo(it.address)
           
it.name = workService.processWorkOne(it.name)
}
单元试通不q?br /> 以上是表明1..3的含义:q个Ҏ要连l被调用臛_一ơ,臛_三次?br /> 但是有的我在UserService中就要这么写
userList.each {
            it.name 
= workService.processWorkOne(it.name)
           
it.name = workService.processWorkOne(it.name)
            it.address = workService.processWorkTwo(it.address)
           
it.name = workService.processWorkOne(it.name)
}
那我要怎么改单元测试才能通过Q?br /> 我们?/span>UserServiceTests的demandq段代码
workControl.demand.processWorkOne(1..1){String userName ->
     
return "hello world, " << userName
}
workControl.demand.processWorkTwo(
1..1){String address ->
      
return "location in " << address
}

Ҏ
workControl.demand.processWorkOne(1..2){String userName ->
      
return "hello world, " << userName
}
workControl.demand.processWorkTwo(
1..1){String address ->
       
return "location in " << address
 }

workControl.demand.processWorkOne(1..1){String address ->
       
return "location in " << address
 }
q样通过了?br /> 以上是说明构造出来的函数只能按照构造的序调用。今天就是因个花了我好长旉啊,希望我理解是正确的。如有不对,LaU正?/span>




yangpingyu 2011-05-13 21:40 发表评论
]]>
grails学习Q一QGrails工程与maven集成http://www.aygfsteel.com/yangpingyu/archive/2011/05/10/349898.htmlyangpingyuyangpingyuTue, 10 May 2011 02:34:00 GMThttp://www.aygfsteel.com/yangpingyu/archive/2011/05/10/349898.htmlhttp://www.aygfsteel.com/yangpingyu/comments/349898.htmlhttp://www.aygfsteel.com/yangpingyu/archive/2011/05/10/349898.html#Feedback0http://www.aygfsteel.com/yangpingyu/comments/commentRss/349898.htmlhttp://www.aygfsteel.com/yangpingyu/services/trackbacks/349898.html 

Grails工程与maven集成

Grails其实也有自己的一些项目管理命令,如:grails packageQgrails test-appQgrails war{。但是公司现在基本上都是用maven来管理项目,所以从理上进行统一的目的,我们也让grails工程由maven来管理?/span>

Grails与maven集成是靠maven插g机制?/span>

接下来描qC集成的步骤:

1?/span>?home/.m2/settings.xml中配|plugin group

<settings>

 

 <pluginGroups>

    <pluginGroup>org.grails</pluginGroup>

 </pluginGroups>

</settings>

没有配置之前Q要q行grailsQhelp命o要这样写Qmvn org.grails:helpQ有了配|之后我们就可以q么写:mvn grails:help?/span>

2、我们创Z个maven理的grails工程

Mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-4:generate
    -DarchetypeGroupId=org.grails 
    -DarchetypeArtifactId=grails-maven-archetype 
    -DarchetypeVersion=1.2.0 
-DgroupId=example -DartifactId=my-app
grails-maven-archetypeq里用的?.2.0版本Q好像maven3集成的版本比q个要新?/span>
 
3、进入my-app当前目录Q运行mvn initialize
在运行过E中可能会出现如下问题:
Resolving plugin JAR dependencies 
:: problems summary ::
:::: WARNINGS
               module not found: org.hibernate#hibernate-core;3.3.1.GA
那么你在application.properties文g中添加plugins.hibernate=1.3.2
plugins.tomcat=1.3.2两个插g。最后运行mvn compile重新~译工程?/span>
 
4、我们是用springsource tool suite开发,导入工程。项目中需要对excel操作Q我们采用jxl.jar开源包。在pom文g中配|如下内容:

<dependency>

      <groupId>jxl</groupId>

      <artifactId>jxl</artifactId>

      <version>2.4.2</version>

</dependency>
重新~译下工E,但是引用jxl包中cȝ文gq是报错Q说找不到类。这怎么回事呢?我也很纳P一般maven工程都是q样可以?/span>
 
后来在官Ҏ档上看到一句话Qpom=true。只要把q句话加到conf/BuildConfig.groovy文g中的grails.project.dependency.resolutionҎ中。如图:
 
重新~译Q但是还是报错。Ideq是无法引用jxl包中的类。后来发现在grails tools中找C一个命令?/span>
 
执行q后Q已l加入到了grails dependencies中?/span>
 
Z么会q样呢,是因为有两套机制造成的?/span>
W一套机Ӟmaven自n理目的机制?/span>
W二套机Ӟgrails也有自己的一套管理机制?/span>
 
在绝大多数情况下maven通过grails的集成插件可以对工程q行打包Q部|Ԍq行试{管理?/span>
Grails可以通过自己的grails war{命令进行打包,部vQ运行测试等理?/span>
Grails也可以通过配置pom=true让grails那套理机制用pom中的配置Q不使用自己的管理机制。此时你׃用在conf/BuildConfig.groovy中管理依赖和资源库等配置?/span>
 


yangpingyu 2011-05-10 10:34 发表评论
]]>
վ֩ģ壺 | | ƽ| Ҧ| | | | ϰ| | | ѧ| ֹ| ǿ| ٹ| | Ϫ| | ˮ| | | | | | | ƽ| | Ҷ| | ɳ| ˮ| Ӧ| | Ϫ| ԭ| | | ̨| | | ̩| |