簡體   English   中英

在Groovy單元測試中使用MockFor模擬Sql.call()

[英]Using mockFor to mock Sql.call() in a groovy unit test

我正在嘗試在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()
        }
    }
}

這是目標代碼:

package com.sample

import groovy.sql.Sql

class MySample {
  def dataSource

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

錯誤如下:

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

該錯誤使call()方法似乎沒有被模擬。 是這樣嗎 有什么解決辦法?

mockSql.demand.call替換了mockSql.metaClass.call提供了一個mockSql.metaClass.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
    }
}

我還不太了解這種情況,但這為我解決了這個問題。

其他外觀更改以及將targetObject實例移出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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM