2016-05-10 3 views
3

Как мне добавить другую услугу в Grails UnitTest (Specification) с помощью Spock?Grails Spock Mock Injected Service in Unit Test

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 
    } 
} 
+0

Службы, не будет автоматически проводятся в спецификациях единиц, поэтому 'SeviceTwo' должно быть издевательствовано в тесте, чтобы сделать его доступным для' ServiceOne'. Попробуйте 'service.serviceTwo = Mock (ServiceTwo)' in 'given:' block или 'setup()' в тесте. – dmahapatro

ответ

0

Это, как я решил мой вопрос - путем создания объекта службы (Это не синглтон, но это нормально, так как это только для модульного тестирования)

// 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 
    } 
} 
0

Сверху моей головы это должно начаться.

@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 
    } 
}