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?
您必须像下面这样嘲笑 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。
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
2854 次 |
| 最近记录: |