from:
http://hamletdarcy.blogspot.com/2008/04/testing-java-from-groovy-2.html
本人正在实践用groovy来测试java代码, 这篇文章给出了两个使用groovy测试java代码与测试groovy代码的区别.
一个是groovy能对groovy代码中的静态方法进行mock, 但是不能对java代码的静态方法进行mock, 本人也碰到这种问题, 当时也没有看到有地方提到这一点.
比如这样的代码:
import java.io.File;
public class JavaService {
static long getFileSize(String path) {
File file = new File(path);
return file.length();
}
}
然后是groovy代码:
class GroovyClient {
def filename;
public long getFileSize() {
return JavaService.getFileSize(filename);
}
}
然后测试代码:
def client = new GroovyClient(filename: "shortFile.txt")
def mock = new MockFor(JavaService)
mock.demand.getFileSize("shortFile.txt") { -1 }
mock.use {
assert -1 == client.getFileSize()
}
如果GroovyClient 是java代码, 则上面的测试将无法成功
第二个是groovy可以对groovy的new操作符进行mock, 但是不能对java的new操作符进行mock.
比如上面的测试代码, 这样写:
def mock = new MockFor(File)
mock.demand.length() { longFileSize }
mock.use {
assert longFileSize == GroovyService.getFileSize("shortFile.txt")
}
但是如果是JavaService则这个测试会失败, 如果把new看成是class的静态方法, 这个就很好理解了.
虽然用groovy对java代码进行测试有这两个限制, 但是使用groovy做java测试还有更多的好处: 最大的好处就是能更容易的构造测试数据, 更容易的stub接口进行测试, 闭包, collect和inject在对大量测试数据的构造上也是一个巨大的优势.
在这篇文章中提到另外两篇用groovy写单元测试的文章, 我也一并简单的写出来:
from:
http://groovy.dzone.com/news/writing-unit-tests-using-groov
groovy对构造数据的简化, 有一个菜单数据结构, 用java是这样的:
...
group = new MenuGroup();
group.setPosition(0);
group.setName("TestGroup");
topLevelItem1 = new TopLevelItem();
topLevelItem1.setPosition(1);
topLevelItem1.setParent(group);
subLevelItem1 = new SubLevelItem();
subLevelItem1.setPosition(2);
subLevelItem1.setParent(topLevelItem1);
subLevelItem2 = new SubLevelItem();
subLevelItem2.setPosition(3);
subLevelItem2.setParent(topLevelItem1);
Set<Integer> roles = new HashSet<Integer>(3);
roles.add(1);
roles.add(2);
roles.add(3);
parent1 = new ParentService();
parent1.setMenuItem(topLevelItem1);
parent1.setName("parent1");
parent1.setRoleIds(roles);
parent1.setUrl("parent1");
topLevelItem1.setService(parent1);
...
而用groovy可以简化成这样:
...
group = new MenuGroup(position : 0, name : "TestGroup")
topLevelItem1 = new TopLevelItem(position : 1, parent : group)
subLevelItem1 = new SubLevelItem(position : 2, parent : topLevelItem1)
subLevelItem2 = new SubLevelItem(position : 3, parent : topLevelItem1)
def roles = [1,2,3] as Set
parent1 = new ParentService(menuItem : topLevelItem1,
name : "parent1", roleIds : roles, url : "parent1")
topLevelItem1.service = parent1
...
同样的功能, 22行java代码用了8行groovy代码搞定,耶!
from:
http://groovy.dzone.com/news/follow-writing-unit-tests-usin
这篇文章使用了builder来构造测试数据:
def group = builder.menuGroup( position: 0, name: 'TestGroup' ){
topLevelItem( position: 1 ){
subLevelItem( position: 2 )
subLevelItem( position: 3 )
parentService( name: 'parent1', url: 'parent1', roleIds: [1,2,3] as Set )
}
}
看起来更nice!
分享到:
相关推荐
标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...
在Java开发中,Groovy是一种强大的、动态类型的脚本语言,它可以无缝地与Java代码集成,为开发者提供了更简洁、灵活的语法。本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。...
Java代码会连接到MongoDB,找到这个文档,读取Groovy脚本,然后使用GroovyClassLoader进行加载和执行。 动态加载数据库中的Groovy脚本带来的优势包括: - **热部署**:当Groovy脚本更新时,无需重新编译或重启Java...
在Java中,Groovy是一个强大的脚本语言,它与Java语法兼容,并且可以无缝集成到Java应用程序中,使得动态代码执行变得更加便捷。Groovy提供了GroovyShell、GroovyScriptEngine和GroovyClassLoader等工具,允许我们...
Groovy环境搭建教程中的例子工程,纯Java、纯Groovy以及Java+Groovy混合 教程参考:http://blog.csdn.net/rcom10002/archive/2011/06/26/6568557.aspx
Java 嵌入运行 Groovy 代码是一种常见的技术实践,特别是在需要动态脚本执行或灵活扩展功能的场景中。Groovy 是一种与 Java 兼容的动态编程语言,它的语法简洁,适合编写脚本和快速原型开发。在 Java 应用程序中运行...
JavaGroovy用Groovy更迅速地对Java代码进行单元测试软件测试不久以前,developerWorks的作者AndrewGlover撰写了一篇介绍的文章,该文章是alt.lang.jre系列的一部分,而Groovy是一个新提议的用于平台的标准语言。...
软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...
8. **Groovy插件的其他功能**:除了基本的开发工具,Groovy插件还可能包含其他实用功能,如代码重构工具、生成文档、依赖管理等,这些都是提高开发效率的关键要素。 9. **持续集成与构建工具**:在Groovy项目中,...
- **混合使用**:开发者可以在Java项目中引入Groovy脚本来执行特定任务,比如配置文件解析或测试脚本编写。 - **代码互操作性**:Groovy和Java之间可以直接相互调用方法和构造器,这种无缝的互操作性为项目带来了极...
通过"groovy-se-study"这个学习案例,你可以逐步探索和实践如何将这两个强大的工具结合在一起,从而提高你的编程效率和代码质量。 在"groovy-se-study-master"这个压缩包中,可能包含了一系列的Groovy脚本文件,每...
8. **Spock(测试框架)**:Spock是Groovy的一个测试框架,它的语法优雅,易于理解,适合进行行为驱动开发(BDD)的测试。 9. **Scripting in Java Applications**:Groovy可以嵌入到Java应用中作为脚本语言使用,...
标题“hugo110-java_run_groovy-master_java_”表明这是一个关于使用Java运行Groovy脚本的项目,可能是某个GitHub仓库的克隆或归档。描述中提到,这个环境是为了方便用户(可能是开发者)实践Groovy语言,并为后续的...
Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有...
Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing the key differences between Java and Groovy and how you...
编写第一个 Groovy 类,然后学习如何使用 JUnit 轻松地进行测试。借助功能完善的 Groovy 开发环境和使用技能,您将轻松完成本教程的学习。最重要的是,您将学会如何在日常 Java 应用程序开发中联合使用 Groovy 和 ...
在这个目录下,我们可以期待找到如`src/main/java`、`src/test`等子目录,分别存放着Groovy的主代码和测试代码。每个子目录将进一步细化,按照包结构组织,例如`org.codehaus.groovy`,其中包含了Groovy的各个模块,...
SpringBoot、Gradle、Maven、Java和Groovy是Java生态...- 在测试和配置管理中使用Groovy,如Spock测试框架和Grails配置。 理解并熟练掌握这些技术,有助于提升Java开发者的专业技能,更好地适应现代企业级开发的需求。
这篇博客文章“Java调用Groovy”可能会探讨如何在Java代码中执行Groovy脚本,以及这样做的优势和实践方法。 首先,Java可以通过`GroovyShell`或`GroovyScriptEngine`来执行Groovy脚本。`GroovyShell`是Groovy提供的...
Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 ...