当前位置: 首页 > 知识库问答 >
问题:

使用Spock和服务类在Grails中进行数据驱动测试

况弘新
2023-03-14
class MyServiceSpec extends Specification {
    def myService
    def sqlService
    @Shared tsQuery
    @Shared ts

    def setupSpec() {
        tsQuery = "select column1, column2, column3 from table where column1 = ?"
        ts = sqlService.rows(tsQuery, ['someSuch'])
    }

    def "test a feature"() {
        setup:
            def ts = sqlService.rows(tsQuery)
            def results = myService.getTimesheets(thing1, thing2, thing3)
        expect: 
            //some appropriate expectations based on the data here
        where:
            timeSheet << ts
            thing1 = timeSheet.column1
            thing2 = timeSheet.column2
            thing3 = timeSheet.column3
    }
}
Only @Shared and static fields may be accessed from here
       ts = sqlService.rows(tsQuery)
            ^

问题是,如果我使sqlService@shared,Grails依赖项注入不起作用,它只创建一个空对象。如果我尝试将其设置为静态(如static def sqlservice),情况也是如此。

java.lang.NullPointerException: Cannot invoke method rows() on null object

我尝试将一个新的SqlService实例小型化,就像我的setupSpec块中所示:

    def setupSpec() {
        tsQuery = "select column1, column2, column3 from table where column1 = 'someSuch'"
        def sql = new SqlService()
        ts = sql.rows(tsQuery)
    }

这只是给出了一个错误

有人知道我如何在Spock测试中使用另一个服务类作为数据提供者吗?

共有1个答案

魏冷勋
2023-03-14

所以,这就是我的工作测试类最终的样子:

package edu.missouristate.employee.dts

import spock.lang.*
import static org.junit.Assert.*
import org.junit.*
import groovy.sql.Sql
class MyServiceSpec extends Specification {
    def myService
    def dataSource
    @Shared tsQuery
    @Shared ts

    def setup() {
        tsQuery = '''select column1, column2, column3 
            from table where column1 = ?
            and rownum < 6'''
        def sql = new Sql(dataSource)
        ts = ts ?: sql.rows(tsQuery, ['someSuch'])
        sql.close()
    }

    def "dummy test"() { //This is just to get the spec initialized.
        expect:
            1==1
    }

    def "test a feature"() {
        setup:
            def results = myService.getTimesheets(timeSheet.thing1, timeSheet.thing2, timeSheet.thing3)
        expect: 
            //some appropriate expectations based on the data here, e.g.
            results[0].someProperty == timeSheet.correspondingDatabaseColumn
        where:
            timeSheet << ts
    }
}

简而言之,我放弃了使用自己的sqlService类,而是直接使用Groovy Sql类。

其他注意事项:我在测试方法和迭代中有效地重用了ts对象,因为我只想从数据库中提取一次数据。我还在查询中添加了rownum限制,这样它就只能执行这么多的迭代。

 类似资料:
  • 我正在将Grails2中的一系列单元测试升级到Grails3,并在使用Spock数据驱动测试格式驱动测试的域测试中遇到问题。 当我执行测试时,因为测试执行没有填充测试中的错误、字段和val引用。如前所述,这个测试适用于Grails2.5.5,所以我怀疑我缺少了Grails3中需要的一些东西。 Edited:我删除了原来在setup()中的mockForConstraints()调用,使其无效。

  • 问题内容: 您如何在jUnit中编写数据驱动的测试? (我的定义)数据驱动测试是一种从某些外部源(文件,数据库等)读取数据,每行/文件/任何内容执行一个测试,并将结果显示在测试运行程序中的测试,就像您进行了单独的测试- 每次运行的结果将单独显示,而不是汇总显示。 问题答案: 在JUnit4中,您可以使用Parameterized testrunner进行数据驱动的测试。 它的文档记录不是很好,但是

  • 我尝试使用Grails 1.3.7、Geb、Spock和Selenium运行功能测试。下面是我的buildconfig.groovy文件: 测试代码如下所示:

  • 然而我却遇到了错误。我无法确定错误发生的确切位置,但我从结果树中获得了如下错误消息: 对于JSR223采样器 响应消息:javax.script.scriptException:源文件:内联计算:import org.apache.poi.xssf.usermodel.xssfworkbook;导入org.apache.poi.xssf.us。..“:INTEGER.parseint(vars.g

  • 我有以下类要测试

  • 使用Selenium,我编写了下面的代码,从Excel表中读取数据,并在电子邮件中键入密码,进入Facebook的登录页面。错误是使用try/catch时未处理的表达式。我如何解决这个问题?