如何在 Grails Spock 单元测试中初始化/连接 beans?

Joh*_*ohn 3 grails spring spock spring-data

我想测试一个包含 bean 的 Grails 控制器(当我让它工作时我会将它移动到一个服务,但我现在只想保持简单)。

//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"
    }
}
Run Code Online (Sandbox Code Playgroud)

在 TestControllerSpec 中,myBean 为 null。controller.myBean 也为空。我认为这是因为 Spring 没有拾取 bean 并将其连接起来。我发现在单元测试中并非所有 spring bean 都可用,但是我需要做什么才能正确实例化并连接controller.myBean?

Vin*_*ati 5

您必须像下面这样嘲笑 myBean

def myBean = Mock(MyBean)
Run Code Online (Sandbox Code Playgroud)

或者

MyBean myBean = Mock()
Run Code Online (Sandbox Code Playgroud)

然后根据需要存根方法,如下所示:

myBean.show >> "test data"
Run Code Online (Sandbox Code Playgroud)

然后将其分配给已经为您模拟的控制器对象。

controller.myBean = myBean
Run Code Online (Sandbox Code Playgroud)

就这样吧。

或者您可以选择存根 myBean 并提供存根实现。例如,

MyBean myBean = Stub(){
show() >> {return "sample text"}
}
controller.myBean = myBean
Run Code Online (Sandbox Code Playgroud)

这样做的原因是我们不是测试控制器、视图或域等应用程序实体的集成,而是测试单个单元,即方法,因此我们应该只测试它,对于集成,我们应该使用集成测试用例除了在正常情况下不需要任何模拟之外,一切都会相似。

编辑:

发现另一个有用的功能来使用defineBeans闭包来模拟服务或 bean,如下所示:

        defineBeans {
            adapter(Adapter)
            helperService(HelperService)
        }
Run Code Online (Sandbox Code Playgroud)

这将允许从 访问 bean grailsApplication

希望能帮助到你。