模拟在 Spock 框架中不起作用

Mocking is Not working in Spock Framework

我正在尝试编写 Spock 框架而不是 Junit,

测试Class:

class StudentServiceSpec extends Specification{

@Shared def studentDao
@Shared def studentService

def setupSpec(){
    studentDao = Mock(StudentDao)
    studentService = new StudentService(studentDao)
}

def "Get Student Details Based on StudentId"(){

    setup:
    1*studentDao.getStudent(67) >> new Student()

    when:
    Response response = studentService.getStudent("67")
    println "** Response "+response
    println "** Response "+response.getEntity()

    then:
    response != null
    }
}

当我 运行 使用 maven clean install 命令执行上述代码时,出现以下错误。

错误:

    1*studentDao.getStudent(67) >>> new Student()   (0 invocations)

如果我使用0*studentDao.getStudent(67) >>> new Student() 我得到 response.getEntity()null

这不起作用的原因有很多。

一个原因是您在实际代码和测试中使用的参数的数据类型可能不一致。下面举例说明

studentDao.getStudent(67) 

检查您的 Dao 方法 getStudent 是否接受 long 数据类型或 int 数据类型。 67 在您的 spock 测试中可能被视为 int,而在您的实际代码中,方法 getStudent 只接受 long 数据类型。因此,无法模拟 studentDao.getStudent(67) 对 return new Student().

的调用

其他可能是,在实际调用 dao 方法 getStudent 之前更改了 id

所以。

  1. 检查你的参数的数据类型 studentDao.getStudent(_) 如果它很长,在你的测试中尝试 67L
  2. 在调用你的dao方法之前检查是否有其他代码修改了id

至于为null的结果

0*studentDao.getStudent(67) >>> new Student() I am Getting response.getEntity() is null

null 是预期的,因为没有将您的 dao 方法模拟到 return 学生对象。

我发现了我的错误...

我替换了下面的代码

@Shared def studentDao
@Shared def studentService

def setupSpec(){
studentDao = Mock(StudentDao)
studentService = new StudentService(studentDao)
}

加上这两行

 StudentDao studentDao = Mock()
 StudentService studentService = new StudentService(studentDao)

如果我们使用 @Shared 它模拟 class 而不是模拟 method call