Spring 如何在Grails Spock单元测试中初始化/连接bean?
我想测试一个包含bean的Grails控制器(当它工作时,我将把它移动到服务中,但我现在只想让它保持简单)Spring 如何在Grails Spock单元测试中初始化/连接bean?,spring,grails,spring-data,spock,Spring,Grails,Spring Data,Spock,我想测试一个包含bean的Grails控制器(当它工作时,我将把它移动到服务中,但我现在只想让它保持简单) 在TestControllerSpec中,myBean为null。controller.myBean也为null。我认为这是因为Spring并没有把豆子捡起来并把它连接起来。我推测,在单元测试中,并非所有SpringBean都可用,但我需要做什么才能使controller.myBean被实例化并正确连接?您必须模拟myBean,如下所示 def myBean = Mock(MyBean)
在TestControllerSpec中,myBean为null。controller.myBean也为null。我认为这是因为Spring并没有把豆子捡起来并把它连接起来。我推测,在单元测试中,并非所有SpringBean都可用,但我需要做什么才能使controller.myBean被实例化并正确连接?您必须模拟myBean,如下所示
def myBean = Mock(MyBean)
或
然后,根据您的需要,按以下要求使用存根方法:
myBean.show >> "test data"
defineBeans {
adapter(Adapter)
helperService(HelperService)
}
然后将其分配给已为您模拟的控制器对象
controller.myBean = myBean
就这样
或者,您也可以选择删除myBean并给出存根实现。比如说,
MyBean myBean = Stub(){
show() >> {return "sample text"}
}
controller.myBean = myBean
这样做的原因是我们没有测试像controller这样的应用程序实体的集成,视图或域,但我们正在测试单个单元,即方法,因此我们应该只测试它,对于集成,我们应该使用集成测试用例,除了在正常场景中不需要任何模拟之外,其他方面都类似
编辑:
找到了另一个有用的功能,可以使用defineBeans
closure模拟服务或bean,如下所示:
myBean.show >> "test data"
defineBeans {
adapter(Adapter)
helperService(HelperService)
}
这将允许从grailsApplication
访问bean
希望有帮助。您可能不希望在单元测试中这样做。您可以在
setup
方法中模拟或存根它:def setup(){controller.myBean=stub(myBean)}
然后使用来测试您的控制器。同意,但是show()在我的真实代码中实际做的是写入内存中的图形数据库。我想检查我的方法是否确实导致将真实数据写入db,而不是我的方法调用写入db的方法(即通过模拟)。(当然,在这个过程中,为了更好地理解Spring实际上是如何工作的),但是为MyBean编写一个单元测试并在那里执行该测试不是更好吗?否则,在这种情况下,集成或功能步骤可能更有意义。是的,谢谢,您的回答让我发现了Grails中集成和功能测试之间的区别。我还没有找到一个在src/java中编写bean并在Grails中进行单元测试的示例,因此我将就此单独提出一个问题。