使用Spock 单元测试

一、什么是Spock

Spock 是一个测试框架,甚至可以说是一门语言他是基于Groovy开发的。它的语法完全遵循 BDD(行为驱动开发) 风格的结构。它是基于 Junit test runner 上开发但是又跟 Junit 完成不一样,同时集成了像 Jmock、Mockito 等语法表达风格于一体,使得它很简洁有很高的可读性。

 

二、Spock 优缺点

  •   语法清晰简单并且有很高的可读性

  •   不好的就是需要学习下Groovy 的语法,对Maven的配置不是很友好。但是在Gradle 中可以很好的支持

三、如何使用Spock

Maven 的配置

 

  •   Gmavenplus-plugin 插件可以让你的测试代码支持 Groovy 语法
  •   Surefire 插件 测试时只执行带有 Spec后缀的代码,这个必须是*Spec.java 而不是 groovy
  •   spock-core 就是 spock 的核心包
  •   byte-buddy 用来做动态代理,如果你需要测试的代码没有实现接口。spock 无法帮你mock,当然你也可以用 cliglib 代替

声明类

/**
 *
 * @author: serio.shi(苦参)
 * @create 2020/08/05 17:22
 * */
public class User {

    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
View Code

Dao 类

interface UserDao {
    public User get(int id);
    public User findByName(String name);
    public void createUser(User user);
}
View Code

UserService 类

/**
 *
 * @author: serio.shi(苦参)
 * @create 2020/08/05 17:23
 * */
public class UserService {

    private UserDao userDao;

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }

    public User findUser(int id){
        return userDao.get(id);
    }

    public void createUser(User user){
        User existing = userDao.findByName(user.getName());

        if(existing == null){
            userDao.createUser(user);
        } else{
            throw new RuntimeException(String.format("User with name %s already exists!", user.getName()));
        }
    }
}
View Code

测试 service的findUser 方法 mock dao的get 方法返回一个固定 user

是的你没有看错,它的方法名就是一个字符串(它有什么好处后面再讲)。它的语法很简单 given:、when:、then:、

setup 是它的元方法在测试用例执行前调用类似于 @before

  •  given 需要的一些变量参数
  •  when 就是需要测试的方法
  •  then 就是期待的结果

1 * dao.get(id) >> new User(id:id, name:"James", age:27)

表示 dao.get(id) 方法将会被调用一次,并且让他返回 new User(id:id, name:"James", age:27) 对象。并且期待它的结果是 result.id == 1、result.name == "James"、result.age == 27

在运行测试后

 

从图中我们可以看到,我们定义的方法名被打印出来。我们可以很方便的看到我们想要测试的内容成功了。

如果验证没有通过 Spock 将通过图表的方式告诉你哪里出问题,并且它会帮你把两个值的打印出来帮你做对比(经常有小伙伴写测试用例的时候把值打印出来用肉眼来识别错误)。我们把期待的id改为12再来试下。

 

 

  我们可以看到 Spock 提示你测试用例失败了,你的id 是1而期待的是12,当你点击 <Click to see difference> 的时候将会弹出一个框帮你做数据对比。简直是开发神器啊有木有!!!

Spock 还有一个神奇的参数化测试,类似于表格的形式填入参数和期待的结果

我们先在UserService类中加上以下代码:

Map datatable = [1:"jerry", 2:"tom", 3:"tommy", 4:"jack"]
public String getUser(int id){
    return datatable.get(id)
}
View Code

添加测试用例:

def "spock parameterized test demo"(){
    expect:
    service.getUser(id) == name
where: "some id with name"
    id || name
    1  || "jerry"
    2  || "tom"
    3  || "tommy"
    4  || "jack"
}

可以看到我们可以以更清晰的方式把入参跟结果描述出来,运行结果:

 

当前它还有很多的姿势待我们去解锁,本文只举例了简单的案例。

更多详情点击:http://spockframework.org/spock/docs/1.3/all_in_one.html#_introduction

四、小结

Spock 有着依赖少、运行快、语法简单、代码清晰等特点、本文只做简单的举例用于学习和记录

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Groovy和Spock是一对非常强大的测试工具,经常被用于Java应用程序的单元测试和集成测试。Groovy是一种动态语言,它能够与Java无缝集成,提供了更简洁、灵活的语法和更强大的功能。Spock是一种基于Groovy的测试框架,它结合了传统的单元测试框架和行为驱动开发(BDD)的思想,提供了一种更易读、更易维护的测试编写方式。 使用Groovy和Spock进行测试非常简单。首先,你需要在项目中引入相应的依赖。对于Groovy,你可以在项目的构建工具(如Maven或Gradle)中添加Groovy的依赖。对于Spock,你需要添加spock-core和spock-spring(如果需要与Spring集成)这两个依赖。 在编写测试时,你可以使用Spock提供的各种注解和断言来编写测试逻辑。Spock的语法非常接近自然语言,能够更好地表达测试的意图。以下是一个简单的示例: ```groovy import spock.lang.Specification class MySpec extends Specification { def "test addition"() { given: def a = 2 def b = 3 when: def result = a + b then: result == 5 } } ``` 在这个示例中,我们定义了一个名为"test addition"的测试方法。在given块中,我们初始化了两个变量a和b。在when块中,我们执行了相加操作并将结果赋给result变量。在then块中,我们使用断言来验证结果是否等于5。 你可以使用任何Groovy和Java的特性来编写测试逻辑,包括使用Mockito等库进行模拟和依赖注入。 希望这能帮助你入门Groovy和Spock测试!如果你有更多的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值