2014-11-18 4 views
1

Bean이 포함 된 Grails 컨트롤러를 테스트하고 싶습니다. (작동 시키면 서비스로 이동 하겠지만, 지금은 간단하게 유지하고 싶습니다).Grails Spock 유닛 테스트에서 Bean을 초기화/연결하는 방법은 무엇입니까?

//resources.groovy 
beans { 
    myBean(com.me.MyBean) 
} 


// MyBean.java 
// this needs to be in java as it is playing with spring-data-neo4j 
package com.me; 
public class MyBean { 
    String show() { 
     return "Hello"; 
    } 
} 

// TestController.groovy 
package com.me 

import com.me.MyBean 

class TestController { 

    def myBean 

    def index() { 
     render myBean.show() 
    } 
} 


// TestControllerSpec.groovy 
package com.me 

import grails.test.mixin.TestFor 
import spock.lang.Specification 

import com.me.* 

@TestFor(TestController) 
class TestControllerSpec extends Specification { 

    def myBean 

    def setup() { 
     defineBeans { 
      myBean(com.me.MyBean) {bean-> 
       bean.autowire = true 
      } 
     } 
    } 

    def cleanup() { 
    } 

    def "show() returns Hello"() { 
     when: 
     def rc = controller.myBean.show() 
     def rc2 = myBean.show() 

     then: 
     rc == "Hello" 
     rc2 == "Hello" 
    } 
} 

내에서 TestControllerSpec, myBean은 null입니다. controller.myBean도 null입니다. Spring이 빈을 집어 넣지 않고 배선하고 있기 때문이라고 생각합니다. 단위 테스트에서 모든 스프링 빈을 사용할 수있는 것은 아니지만 controller.myBean을 인스턴스화하고 올바르게 배선하려면 어떻게해야합니까?

+0

단위 테스트에서 그러지 않을 수도 있습니다. 대신'setup' 메쏘드에서 그것을 조롱하거나 스텁시킬 수 있습니다 : def setup() {controller.myBean = Stub (MyBean)}'그리고 [interactions] (http://spock-framework.readthedocs.org/en /latest/interaction_based_testing.html) 컨트롤러를 테스트하십시오. –

+0

동의하지만, 실제 코드에서 실제로 수행중인 show()는 메모리에있는 그래프 데이터베이스에 쓰는 것입니다. 내 메소드가 실제로 db에 쓰여지는 실제 데이터를 가져 오는지 확인하고 싶습니다. 내 메소드가 db에 쓰는 메소드를 호출하지는 않습니다 (즉, 조롱하여). (그리고 물론, 과정에서 Spring이 실제로 어떻게 작동하는지 더 잘 이해할 수 있도록). – John

+2

하지만 MyBean의 단위 테스트를 작성하고 테스트를 수행하는 것이 더 좋지 않습니까? 그렇지 않으면 통합 또는 기능 단계가이 경우에 더 적합 할 수 있습니다. –

답변

3

당신은 다음과 같이 필요한 경우 귀하의 필요에 대한 방법을 스텁 다음

def myBean = Mock(MyBean) 

또는

MyBean myBean = Mock() 

아래로에서 myBean을 조롱해야합니다 지정 후

myBean.show >> "test data" 

및 그것은 이미 당신을 위해 조롱 된 컨트롤러 객체입니다.

controller.myBean = myBean 

등이 있습니다.

또는 선택적으로 myBean을 스텁하고 스텁 된 구현을 제공 할 수 있습니다. 예를 들어,

MyBean myBean = Stub(){ 
show() >> {return "sample text"} 
} 
controller.myBean = myBean 

이 우리가 컨트롤러, 뷰 또는 도메인과 같은 응용 프로그램 개체의 통합을 테스트하는 것이 아니라 우리가하는 방법, 즉 하나의 장치를 테스트하고 있습니다입니다 수행하는 이유는, 따라서 우리는 단지 그것을 테스트해야하며, 통합을 위해서는 일반적인 시나리오에서 조롱을 요구하지 않는다는 점을 제외하고는 모두 유사한 통합 테스트 케이스를 사용해야합니다.

편집

:

 defineBeans { 
      adapter(Adapter) 
      helperService(HelperService) 
     } 

이 콩은 grailsApplication에서 액세스 할 수 있습니다 :

아래와 같이 defineBeans 폐쇄를 사용하여 모의 서비스 나 콩에 또 다른 유용한 기능을 발견했다.

희망이 있습니다.

관련 문제