用groovy测试java代码的两个障碍及其他
发布时间:2020-12-14 17:04:23 所属栏目:大数据 来源:网络整理
导读:from: http://hamletdarcy.blogspot.com/2008/04/testing-java-from-groovy-2.html 本人正在实践用groovy来测试java代码,这篇文章给出了两个使用groovy测试java代码与测试groovy代码的区别. 一个是groovy能对groovy代码中的静态方法进行mock,但是不能对java
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,3] as Set ) } }看起来更nice! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |