Grails 如何根据环境重写resources.groovy中的控制器?

Grails 如何根据环境重写resources.groovy中的控制器?,grails,Grails,我有一个场景,希望在功能测试期间覆盖某些控制器,以便在运行时调用模拟控制器。我可以很容易地覆盖resources.groovy中的服务,如下所示:(有文档记录和) 当应用程序在测试环境中运行时,这种方法会正确重定向到模拟服务 然而,与控制器使用的相同方法不起作用。这是我目前的尝试: // grails-app/conf/spring/resources.groovy beans = { switch(Environment.current) { case Environm

我有一个场景,希望在功能测试期间覆盖某些控制器,以便在运行时调用模拟控制器。我可以很容易地覆盖resources.groovy中的服务,如下所示:(有文档记录和)

当应用程序在测试环境中运行时,这种方法会正确重定向到模拟服务

然而,与控制器使用的相同方法不起作用。这是我目前的尝试:

// grails-app/conf/spring/resources.groovy
beans = {
    switch(Environment.current) {
        case Environment.TEST:
            expensiveToUseController(MockExpensiveToUseController)

            break
    }
}
模拟控制器与原始控制器位于同一目录/包中,位于grails app/controllers下

我能看到的唯一明显区别是,我的服务在代码中被使用它们的控制器显式引用,例如

class ExpensiveToUseController { 
    def expensiveToUseService
...
}
另一方面,控制器仅由Grails运行时引用

可能值得一提的是,我没有选择将逻辑从现有控制器转移到服务中,这将提供一个解决方案

我有没有遗漏什么,或者有没有其他方法来实现这一点

编辑:参见下面的答案。

对于其他遇到此问题的人,我不需要额外的bean.scope/autowire参数。这是我的DSL:

beans = {
switch(Environment.current) {
    case Environment.TEST:
        'com.example.ExpensiveToUseController'(com.example.MockExpensiveToUseController)

        break
    }
}

由于控制器不是自动连线的,所以在spring上下文中,控制器是以与其完全限定类名匹配的bean名称注册的,而不是服务使用的“属性名”表示。因此,您需要将测试bean注册为
com.example.ExpensiveToUseController
,而不是
ExpensiveToUseController


但是,将环境检查放在控制器本身的“昂贵”操作中可能更容易。我认为实例化控制器的动作不会太昂贵,因为默认情况下控制器是原型范围。

谢谢您的建议。我已经试过了,现在又试过了,但是没有用。我得到以下错误:“groovy.lang.MissingPropertyException:没有这样的属性:com for class:resources”我不希望将环境检查放在控制器中,我希望将测试代码完全分开。@eustachio您必须在bean DSL中引用它:
'com.example.ExpensiveToUseController'(MockExpensiveToUseController){bean->bean.scope='prototype';bean.autowire='byName'}
beans = {
switch(Environment.current) {
    case Environment.TEST:
        'com.example.ExpensiveToUseController'(com.example.MockExpensiveToUseController)

        break
    }
}