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

标签 spring grails spring-data spock

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

//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 为空。 controller.myBean 也是空的。我认为这是因为 Spring 没有选择 bean 并将其连接起来。我收集到在单元测试中并非所有 spring bean 都可用,但是我需要做什么才能正确实例化和连接 controller.myBean?

最佳答案

你一定是在模拟下面的 myBean

def myBean = Mock(MyBean)

MyBean myBean = Mock()

如果需要,然后根据需要 stub 方法如下:

myBean.show >> "test data"

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

controller.myBean = myBean

好了。

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

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

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

编辑:

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

        defineBeans {
            adapter(Adapter)
            helperService(HelperService)
        }

这将允许从 grailsApplication 访问 bean。

希望对您有所帮助。

关于spring - 如何在 Grails Spock 单元测试中初始化/连接 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26994716/

相关文章:

java - 如何使用查询注释删除 MongoRepository 中的项目?

spring - com.mongodb.MongoSocketOpenException : Exception opening socket with spring boot and mongodb cloud 异常

grails - Grails-通过父集合中子obj的存在来查找所有对象

linux - 我无法使用 java.lang.ClassFormatError : Incompatible magic value 0 in class file 在 linux 上的 tomcat 8.0.36/8.0.24 上部署 grails 应用程序

java - Spring+boot+data - 通过具有关联返回页面的示例进行查询

java - JAX-WS 线程占用 %100 CPU

spring - 将 applicationContext 拆分为多个文件

grails - 在Grails Spring Security Core插件中设置 session 超时

hibernate - 不是托管类型 : class entity. & Spring Data

mongodb - 我们如何使用spring boot为mongodb创建自动生成的字段