gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:51:32 60 4
gpt4 key购买 nike

我想测试一个包含 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/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com