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을 인스턴스화하고 올바르게 배선하려면 어떻게해야합니까?
단위 테스트에서 그러지 않을 수도 있습니다. 대신'setup' 메쏘드에서 그것을 조롱하거나 스텁시킬 수 있습니다 : def setup() {controller.myBean = Stub (MyBean)}'그리고 [interactions] (http://spock-framework.readthedocs.org/en /latest/interaction_based_testing.html) 컨트롤러를 테스트하십시오. –
동의하지만, 실제 코드에서 실제로 수행중인 show()는 메모리에있는 그래프 데이터베이스에 쓰는 것입니다. 내 메소드가 실제로 db에 쓰여지는 실제 데이터를 가져 오는지 확인하고 싶습니다. 내 메소드가 db에 쓰는 메소드를 호출하지는 않습니다 (즉, 조롱하여). (그리고 물론, 과정에서 Spring이 실제로 어떻게 작동하는지 더 잘 이해할 수 있도록). – John
하지만 MyBean의 단위 테스트를 작성하고 테스트를 수행하는 것이 더 좋지 않습니까? 그렇지 않으면 통합 또는 기능 단계가이 경우에 더 적합 할 수 있습니다. –