对程序进行单元测试时,有时我们会遇到一些小麻烦,比如某些操作十分耗时,有些依赖的对象不易获取等等,这时我们就可以通过Groovy Mock或Groovy Stub来解决这些问题。Mock对方法调用的次数十分敏感,如果程序中调用的次数不在期望的调用次数范围内,则会抛出异常以致测试失败;而Stub仅仅是起到‘替身’的作用,它并不关心方法调用与否,即使方法一次都没被调用,也不会抛出异常导致测试失败。
下面让我们来看一个实际的例子吧:
import groovy.mock.interceptor.*
class User {
String name
String address
String toString() {
"Name: $name, Address: $address"
}
}
class UserDao {
User findUserByName(String name) {
if ('山风小子' == name)
return new User(name:name, address:'Shanghai')
else
return new User(name:'Anonymous User', address:'Unknown')
}
}
class ShowUserInfoService {
UserDao userDao = new UserDao()
def showInfo(String name) {
User user = userDao.findUserByName('山风小子')
println user
}
}
/*
平时下面这些代码写于单元测试中,为了简洁起见,单独抽取出来
*/
def userDaoMock = new MockFor(UserDao)
/*
UserDao对象中的findUserByName方法必须被调用1~2次,否则测试失败
同时将findUserByName方法的实现替换为return new User(name:'mock user', address:'Unknown')
*/
userDaoMock.demand.findUserByName(1..2) { String name ->
return new User(name:'mock user', address:'Unknown')
}
userDaoMock.use {
def showUserInfoService = new ShowUserInfoService()
showUserInfoService.showInfo('山风小子')
showUserInfoService.showInfo('Daniel.Sun')
//showUserInfoService.showInfo('BlueSUN')
}
def userDaoStub = new StubFor(UserDao)
/*
仅仅将findUserByName方法的实现替换为return new User(name:'stub user', address:'Unknown')
即使findUserByName方法不被调用,测试也不会失败
*/
userDaoStub.demand.findUserByName { String name ->
return new User(name:'stub user', address:'Unknown')
}
userDaoStub.use {
def showUserInfoService = new ShowUserInfoService()
showUserInfoService.showInfo('山风小子')
}
运行结果:
Name: mock user, Address: Unknown
Name: mock user, Address: Unknown
Name: stub user, Address: Unknown
分享到:
相关推荐
学Groovy,Grails 与学Java一样,在实战之前需要搭建开发环境,您可以在 Groovy轻松入门--搭建Groovy开发环境 学习到如何搭建Groovy环境,之后我会讲一下如何搭建Grails环境,然后手把手地写个Demo程序告终,我还会...
Groovy高效编程 Grails开发进阶
groovy环境的mock工具,用于辅助单元测试.
[Pragmatic Bookshelf] Groovy 2 编程 (英文版) [Pragmatic Bookshelf] Programming Groovy 2 Dynamic Productivity for the Java Developer (E-Book) ☆ 出版信息:☆ [作者信息] Venkat Subramaniam [出版机构...
NULL 博文链接:https://key232323.iteye.com/blog/1336400
groovy入门 groovy入门 groovy入门 groovy入门groovy入门groovy入门
Groovy环境搭建教程中的例子工程,纯Java、纯Groovy以及Java+Groovy混合 教程参考:http://blog.csdn.net/rcom10002/archive/2011/06/26/6568557.aspx
编写第一个 Groovy 类,然后学习如何使用 JUnit 轻松地进行测试。借助功能完善的 Groovy 开发环境和使用技能,您将轻松完成本教程的学习。最重要的是,您将学会如何在日常 Java 应用程序开发中联合使用 Groovy 和 ...
编写第一个 Groovy 类,然后学习如何使用 JUnit 轻松地进行测试。借助功能完善的 Groovy 开发环境和使用技能,您将轻松完成本教程的学习。最重要的是,您将学会如何在日常 Java 应用程序开发中联合使用 Groovy 和 ...
Java中使用Groovy的三种方式,详细见我的博客。
java 动态脚本语言 精通 Groovy
Spock 是适合 Java 和 Groovy 应用程序的一个测试框架
干货:Jenkins Pipeline调用shell、python、java、groovy脚本的正确使用姿势.doc
Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 ...
包含groovy plugin tools, eclemma 测试覆盖率
Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有...
概述主要介绍Java、spring与groovy结合使用,高清英文版本
本系列教程介绍Groovy编程语言的语法。Groovy的语法源自Java语法,但是通过特定类型对其进行了增强,并允许进行某些简化。