用groovy测试java代码的两个障碍及其他

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, 本人也碰到这种问题, 当时也没有看到有地方提到这一点.

比如这样的代码:
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!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值