簡體   English   中英

Grails Spock Mock在單元測試中注入服務

[英]Grails Spock Mock Injected Service in Unit Test

如何使用Spock在Grails UnitTest(規范)中注入其他服務?

class ServiceOne {

   ServiceTwo serviceTwo

    ModelOne getMethodOne(String name) {
       // do somethings here
       return serviceTwo.getMethodTwo(name)
    }
}

class ServiceTwo {

   ServiceTwo serviceTwo

    ModelOne getMethodTwo(String name) {
       // do somethings here
       return ModelOne.get(name)
    }
}

// Tests
import grails.test.mixin.Mock
import grails.test.mixin.TestFor
import spock.lang.Specification
/**
 * Tests for ServiceOne
 */
@TestFor(ServiceOne)
@Mock(ModelOne)
class ServiceOneSpec extends Specification {
/** Inject serviceTwo in here
    Otherwise the following exception is thrown
    java.lang.NullPointerException: Cannot invoke method getMethodTwo() on null object
*/

void "test method one"() {

    when:
    ModelOne modelOne = service.getMethodOne(name)

    then:
    modelOne != null
   }
}

這就是我解決問題的方法 - 通過創建服務的對象(它不是單例,但它很好,因為它只是用於單元測試)

// Test Spec
import grails.test.mixin.Mock
import grails.test.mixin.TestFor
import spock.lang.Specification
/**
 * Tests for ServiceOne
 */
@TestFor(ServiceOne)
@Mock(ModelOne)
class ServiceOneSpec extends Specification {

    @Shared ModelOne modelOne
    def setup() {
        // the magic
        service.serviceTwo = new ServiceTwo()
        modelOne = service.serviceTwo.getMethodTwo("Name")
    }

    void "test method one"() {

        when:
        ModelOne modelOne = service.getMethodOne(name)

        then:
        modelOne != null
   }
}

在我的頭頂,這應該讓你開始。

@TestFor(ServiceOne)
@Mock(ModelOne)
class ServiceOneSpec extends Specification {

   void "test method one"() {
      given:
         def mockServiceTwo = mockFor(ServiceTwo)
         // expect that getMethodTwo is called once
         mockServiceTwo.demand.getMethodTwo(1) { String name ->
            // for any arbitrary name value, return a new ModelOne
            return new ModelOne()
         }
         service.serviceTwo = mockServiceTwo.createMock()
      when:
         ModelOne modelOne = service.getMethodOne(name)

      then:
         modelOne != null
   }
}

暫無
暫無

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

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