加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

用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!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读