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 インスタンスに正しく組み立てます。代わりに、実際のデータベースにアクセスできる統合テストに切り替えて、db のテスト データを使用してメソッド全体をテストします。

通常、データベース アクセスの単体テストは、コードよりもモッキング コードのテストに近いため、ほとんど役に立ちません。

于 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 metaClass はテストの最後にリセットされないことに注意してください。テスト後にクリアすることをお勧めします。

Sql.metaClass = null
于 2011-01-20T16:58:37.623 に答える