from: [url]http://hamletdarcy.blogspot.com/2008/04/testing-java-from-groovy-2.html[/url]
本人正在实践用groovy来测试java代码, 这篇文章给出了两个使用groovy测试java代码与测试groovy代码的区别.
一个是groovy能对groovy代码中的静态方法进行mock, 但是不能对java代码的静态方法进行mock, 本人也碰到这种问题, 当时也没有看到有地方提到这一点.
比如这样的代码:
然后是groovy代码:
然后测试代码:
如果GroovyClient 是java代码, 则上面的测试将无法成功
第二个是groovy可以对groovy的new操作符进行mock, 但是不能对java的new操作符进行mock.
比如上面的测试代码, 这样写:
但是如果是JavaService则这个测试会失败, 如果把new看成是class的静态方法, 这个就很好理解了.
虽然用groovy对java代码进行测试有这两个限制, 但是使用groovy做java测试还有更多的好处: 最大的好处就是能更容易的构造测试数据, 更容易的stub接口进行测试, 闭包, collect和inject在对大量测试数据的构造上也是一个巨大的优势.
在这篇文章中提到另外两篇用groovy写单元测试的文章, 我也一并简单的写出来:
from:[url]http://groovy.dzone.com/news/writing-unit-tests-using-groov[/url]
groovy对构造数据的简化, 有一个菜单数据结构, 用java是这样的:
而用groovy可以简化成这样:
同样的功能, 22行java代码用了8行groovy代码搞定,耶!
from:[url]http://groovy.dzone.com/news/follow-writing-unit-tests-usin[/url]
这篇文章使用了builder来构造测试数据:
看起来更nice!
本人正在实践用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:[url]http://groovy.dzone.com/news/writing-unit-tests-using-groov[/url]
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:[url]http://groovy.dzone.com/news/follow-writing-unit-tests-usin[/url]
这篇文章使用了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!