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

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)

我想测试一个包含bean的Grails控制器(当它工作时,我将把它移动到服务中,但我现在只想让它保持简单)


在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中进行单元测试的示例,因此我将就此单独提出一个问题。