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

用groovy测试java代码的两个障碍及其他,第1张

概述from: http://hamletdarcy.blogspot.com/2008/04/testing-java-from-groovy-2.html 本人正在实践用groovy来测试java代码, 这篇文章给出了两个使用groovy测试java代码与测试groovy代码的区别. 一个是groovy能对groovy代码中的静态方法进行mock, 但是不能对java代码的静态方法进行mock, 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 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代码的两个障碍及其他所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1270126.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存