因为近来一直在java上进行开发,在单元测试上,公司一直都采用JUnit和Jmock来进行,近来公司想把groovy和gmock引进来做单元测试,所以这段时间一直在看groovy和gmock这2个开源项目,到现在,已经有了一个初步的认识,下面就谈一下自己比较简单的想法吧。
Groovy是一个基于Java虚拟机的敏捷动态语言,可以作为 Java 的补充,它提供了更简单、更灵活的语法,其核心功能包括本地集合、内置正则表达式和闭包,(呵呵,闭包,好东西,看来有不少人讨厌java那个难看的匿名类做法;Groovy支持单元测试和mock,可以简化测试,其提供的GroovyTestCase继承了JUnit的TestCase
GMock则是一个专注于单元测试的优秀项目,提供GMockTestCase继承了JUnit的TestCase,并提供了更简练的mock方法,功能更加强大
比较jmock,groovy.mock,gmock,从简练程度来说gmock应该更理想,并且gmock比其他2种mock提供的功能更加强大
在单元测试上,groovy提供了采用map和clousre(闭包)来替代mock,在测试上也多了一种选择,下面通过一个例子来看一下几种不同的做法
这个例子是测试同 InteractivevoteService.delVote()方法(删除一个投票),这个方法中调用了CommentService.deleteAllPost()方法(删除评论)
1 java+jmock
public class InteractiveVoteServiceTest extends TestCase {
private InteractiveVoteService interactivevoteService;
private Mockery context = new Mockery() {
{
setImposteriser(ClassImposteriser.INSTANCE);
}
};
void setUp() {
//数据准备
interactivevoteService = new InteractiveVoteService()
}
public void test_delVote() {
final CommentService commentService = context
.mock(CommentService.class);
context.checking(new Expectations() {
{
oneOf(commentService).deleteAllPost(1);
}
});
interactivevoteService.setCommentService(commentService);
Vote vote = interactivevoteService.getVoteById(1);
assertNotNull(vote);
interactivevoteService.delVote(1);
Vote vote = interactivevoteService.getVoteById(1);
assertNull(vote);
context.assertIsSatisfied();
}
}
2、groovy+gmock
public class groovy_interactiveVoteServiceTest extends GMockTestCase{
private interactivevoteService
void setUp() {
//数据准备
interactivevoteService = new InteractiveVoteService()
}
void test_delVote() {
def commentService = mock(CommentService)
commentService.deleteAllPost(1).returns()
play{
interactivevoteService.setCommentService(commentService)
def vote = interactivevoteService.getVoteById(1)
assertNotNull(vote)
interactivevoteService.delVote(1)
vote = interactivevoteService.getVoteById(1)
assertNull(vote)
}
}
}
3 groovy闭包替代mock
public class groovy_interactiveVoteServiceTest extends GroovyTestCase{
private interactivevoteService
void setUp() {
//数据准备
interactivevoteService = new InteractiveVoteService()
}
void test_delVote() {
def delete={relate_id-> }
def commentService = [delete_all_post:delete]
interactivevoteService.setCommentService(commentService as CommentService)
def vote = interactivevoteService.getVoteById(1)
assertNotNull(vote)
interactivevoteService.delVote(1)
vote = interactivevoteService.getVoteById(1)
assertNull(vote)
}
}
上面的例子过于简单,可能并不能看出那个更好,在书写上gmock比jmock更加简练,至于closure和gmock,简单的可以用closure实现,复杂的对象替代可以采用gmock,毕竟gmock提供了运行的次数控制等功能,
说一下目前碰到的问题
groovy目前没有太强大的编辑器,虽然有eclipse的插件,但并不理想,特别是debug时,竟然不能step into方法里面,也可能是我没有配好,方法被反射掉了。
不过如果用groovy+gmock来做unit test还是比较理想的,至少可以先用gmock来取代jmock,也就是java+gmock也是可以的,因为研究时间还短,如果有什么不对的地方,可以给我留言指正。
groovy:http://groovy.codehaus.org/
gmock:http://gmock.org/
分享到:
相关推荐
1. **安装和引入**:在给定的压缩包中,`gmock-0.8.0.jar` 是 GMock 的库文件,将其添加到项目的类路径中,即可开始使用。 2. **创建 Mock 类**:首先,我们需要为要模拟的类创建一个 Mock 类,GMock 提供了 `@Mock...
本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。 一、作为嵌入式脚本 Java 6引入了JSR 223(Scripting for the Java Platform),允许在Java程序中直接执行脚本语言。...
通过上述介绍可以看出,在Java开发中,合理利用单元测试框架能够显著提高代码质量和开发效率。掌握如何编写有效的单元测试不仅是对个人技能的提升,也是团队协作和项目成功的重要保障。希望通过对“单元测试之道Java...
JavaGroovy用Groovy更迅速地对Java代码进行单元测试软件测试不久以前,developerWorks的作者AndrewGlover撰写了一篇介绍的文章,该文章是alt.lang.jre系列的一部分,而Groovy是一个新提议的用于平台的标准语言。...
1. 引入Groovy库:在Java项目中添加Groovy的相关依赖,通常是`groovy-all`,确保Java能够访问Groovy运行时环境。 2. 创建GroovyClassLoader:使用这个类加载器可以动态加载和执行Groovy脚本。它继承自Java的...
6. **Groovy与Java的互操作性**:Groovy与Java代码可以无缝地混编和交互,这使得既有Java项目可以轻松引入Groovy来提升生产力,同时保留现有的Java代码基础。 7. **动态语言的优势**:Groovy作为动态语言,提供了...
标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...
这种互操作性使得在现有Java项目中逐步引入Groovy成为可能,而不必重构整个项目。 五、学习资源 "Groovy的帮助文档"是学习Groovy的重要参考资料,它包含了语言的所有细节和用法,包括语法、类库、工具和最佳实践。...
《有效的单元测试》作为一本专注于Java开发者的工具书,深入剖析了单元测试在软件开发中的地位和作用。在过去的十年中,随着自动化单元测试受到越来越多开发者的青睐,其在软件开发过程中的重要性愈发凸显。作者通过...
Groovy 是一种灵活且功能强大的脚本语言,非常适合用于自动化任务、单元测试以及快速应用开发等领域。在 Eclipse 中集成 Groovy 可以为开发者提供一个集成了编辑、调试和运行等功能于一体的开发环境,极大地提高了...
5. 测试与调试:掌握Spock测试框架,进行单元测试和集成测试。 6. 深入理解Groovy与Java的互操作性,以便在既有Java项目中无缝引入Groovy。 五、实战项目实践 通过实际项目,将理论知识应用于解决具体问题,如构建...
在Android开发中,单元测试是确保代码质量、可维护性和减少缺陷的重要环节。它允许开发者对应用程序中的每个小部分(即“单元”)进行独立测试,以验证它们按预期工作。下面将详细介绍Android单元测试的相关知识点,...
Groovy是一种基于JVM的动态编程语言,它不仅继承了Java的强大功能,还引入了动态类型、闭包、DSL等现代编程特性,使得编写自动化测试脚本变得更加简洁和高效。本文将详细介绍Groovy脚本在自动化测试中的应用,包括其...
在Android开发中,单元测试是确保代码质量、可维护性和减少bug的重要手段。它允许开发者在修改或添加功能时,对各个独立的代码模块进行验证,确保它们按预期工作。本篇文章将深入探讨如何在Android项目中进行单元...
在测试领域,Groovy常用于自动化测试,例如在持续集成(CI)/持续部署(CD)流程中,通过编写Groovy脚本来执行各种测试任务,如单元测试、集成测试和端到端测试。由于Groovy的灵活性,它也常被用于编写复杂的测试...
并且提到了Groovy的IDE和编辑器支持情况,以及一些Groovy的基础知识,如类和对象的声明、使用脚本、处理文本、数字、列表、映射和范围,以及如何在Java环境中运行Groovy代码。 需要注意的是,文档中出现的金融信息...
在ADF BC中,我们可以利用Groovy来创建单元测试和集成测试,确保业务逻辑的正确性。 6. **提升性能** 虽然Groovy是动态语言,但它的JVM集成意味着它的性能接近Java。在ADF BC中,这意味着我们可以利用Groovy的效率...
Groovy是一种动态、开源的编程语言,它是Java平台上的一个重要的补充。Groovy结合了Python、Ruby和...在Java项目中引入这个库,你可以轻松地集成Groovy脚本,提升开发效率,同时得益于其动态特性和强大的库支持。
通过GroovyEclipse,开发者可以在Eclipse环境中舒适地编写、测试和运行Groovy代码,提高开发效率。 入门Groovy,首先需要了解其基本语法结构。Groovy的语法与Java类似,但更简洁。例如,类定义可以省略public关键字...