3

我想对一些类似于此的代码的返回值进行单元测试:

Groovy Service code to test:
    def findByThisAndThat(something) {
            : 
        def items = []
        sql.eachRow(query, criteriaList, {
            def item = new Item(name:it.NAME)
            items.add(item)
        })
        [items: items, whatever:whatevervalue]
    }

单元测试代码计划:

   void testFindByThisAndThatReturnsAMapContainingItems(){
       Sql.metaClass.eachRow = { String query, List criteria, Closure c ->

           // call closure to get passed in items list
           // add one new Item(name:"test item") to list
       }

       def result = service.findByThisAndThat("", "")

       assert result.items
       assertEquals('test item', result.items[0].name)
   }

我怎样才能做到这一点?谢谢!

4

2 回答 2

2

像您提议的单元测试实际上只是测试从数据库中给出适当的数据,您将其正确地组装到 Item 实例中。我会切换到集成测试,您可以在其中访问真实数据库并使用数据库中的测试数据测试整个方法。

单元测试数据库访问通常更多的是对模拟代码的测试,而不是对您的代码的测试,因此它通常用处不大。

于 2011-01-20T16:57:24.347 回答
1

通过像方法一样使用它来调用闭包。或者,您也可以使用Closure.call()。传入it作为第一个参数的值。

Sql.metaClass.eachRow = { String query, List criteria, Closure c ->
    def mockItems = ["test item"]
    mockItems.each { item ->
        c(item)
        // c.call(item) works too
    }
}

请注意,Sql 元类不会在测试结束时重置。我建议在测试后将其清除:

Sql.metaClass = null
于 2011-01-20T16:58:37.623 回答