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