本人正在实践用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 Setparent1 = 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,3] as Set ) }}看起来更nice! 总结
以上是内存溢出为你收集整理的用groovy测试java代码的两个障碍及其他全部内容,希望文章能够帮你解决用groovy测试java代码的两个障碍及其他所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)