【发布时间】:2014-11-18 12:46:39
【问题描述】:
我想测试一个包含 bean 的 Grails 控制器(我会在它工作后将其移至 Service,但我现在只想保持简单)。
//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 被实例化并正确连接?
【问题讨论】:
-
你可能不想在单元测试中这样做。您可以在
setup方法中模拟或存根它:def setup() { controller.myBean = Stub(MyBean) },然后使用 interactions 测试您的控制器。 -
同意,但是 show() 在我的真实代码中实际上正在做的是写入内存中的图形数据库。我想检查我的方法是否确实导致将真实数据写入数据库,而不是我的方法调用写入数据库的方法(即通过模拟)。 (当然,在这个过程中,为了更好地了解 Spring 的实际工作原理)。
-
但是为 MyBean 编写一个单元测试并在那里执行该测试不是更好吗?否则,在这种情况下,集成或功能步骤可能更有意义..
-
是的 - 谢谢,您的回答让我发现了 Grails 中集成和功能测试之间的区别。我还没有找到在 src/java 中编写 bean 并在 Grails 中进行单元测试的示例,因此我将在 SO 上发布一个单独的问题。
标签: spring grails spring-data spock