2016-09-28 10 views
0

に私はgroovy.sql.SqlにnewInstance()call()を模擬しようとしている:)グルーヴィーなユニットテスト

これは、ターゲット・コードである
package com.sample 

import grails.test.GrailsUnitTestCase 
import groovy.mock.interceptor.MockFor 
import groovy.sql.Sql 

class MySampleTests extends GrailsUnitTestCase { 

    void testThat_SqlCall_IsInvokedWithexpectedQuery() { 
     def mockSql = new MockFor(Sql.class) 

     mockSql.demand.newInstance { def datasource-> 
      return mockSql 
     } 

     mockSql.demand.call { def sql -> 
      return 0 
     } 

     mockSql.use { 
      MySample targetObject = new MySample() 
      targetObject.myMethod() 
     } 
    } 
} 

groovy.lang.MissingMethodException: No signature of method: groovy.mock.interceptor.MockFor.call() is applicable for argument types: (java.lang.String) values: [test] 

エラーが嘲笑されていない()メソッドの呼び出しのように思われてしまう:

package com.sample 

import groovy.sql.Sql 

class MySample { 
    def dataSource 

    def myMethod() { 
    def conn = Sql.newInstance(dataSource) 
    conn.call("test") 
    } 
} 

それはでてERRS。それは事実ですか?それのための修正は何ですか?

+1

私はここで最も適切な欠落データを考えている:(A)あなたはどのようなユニットテストフレームワークを使用していますか?そして(B)あなたはどんな模造図書館を使っていますか?それ以降はもっと質問があるかもしれませんが、そこから始めましょう。 – BalRog

+0

@BalRog - 私はmockForを使って嘲笑しています。ドキュメントによれば、追加の模擬ライブラリは必要ありません。そうでない場合は教えてください。ユニットテストフレームワークに関する限り、検証コードが存在しなくてもこの例が失敗するので、この質問が重要であるかどうかはわかりません。 –

+0

いいえ、私はすべてのカウントで正しいと思います。これは明らかに私がよく知らないGroovy APIの多くの部分の1つです。 – BalRog

答えて

0

mockSql.metaClass.callmockSql.demand.callを交換し、モックメソッドを提供しますが、メソッドが呼び出されることを手動で検証を必要とし、パラメータ値の:

package com.sample 

import grails.test.GrailsUnitTestCase 
import groovy.mock.interceptor.MockFor 
import groovy.sql.Sql 

class MySampleTests extends GrailsUnitTestCase { 

    void testThat_SqlCall_IsInvokedWithexpectedQuery() { 
     def mockSql = new MockFor(Sql.class) 
     def callInvoked = 0 

     mockSql.demand.newInstance { def datasource-> 
      return mockSql 
     } 

     mockSql.metaClass.call { def sql -> 
      assert sql == "test" 
      ++callInvoked 
      return 0 
     } 

     mockSql.use { 
      MySample targetObject = new MySample() 
      targetObject.myMethod() 
     } 

     assert callInvoked == 1 
    } 
} 

これは、なぜ私が理解することは、まだ十分なグルーヴィーを知りません私の問題を解決しました。

追加の化粧品の変更に加えて、{}になりmySql.useのうち、対象物体のインスタンスを移動:

package com.sample 

import grails.test.GrailsUnitTestCase 
import groovy.mock.interceptor.MockFor 
import groovy.sql.Sql 

class MySampleTests extends GrailsUnitTestCase { 

    MySample targetObject = new MySample() 

    void testThat_SqlCall_IsInvokedWithexpectedQuery() { 
     def mockSql = new MockFor(Sql) 
     def callInvoked = 0 

     mockSql.demand.newInstance { datasource-> 
      mockSql 
     } 

     mockSql.metaClass.call { sql -> 
      assert sql == "test" 
      ++callInvoked 
      0 
     } 

     mockSql.use { 
      targetObject.myMethod() 
     } 

     assert callInvoked == 1 
    } 
} 
関連する問題