我在控制器中遇到了if(Environment.Current == Environment.PRODUCTION)
块中的代码片段,因为代码块在methodA
中调用restService
进行REST调用到仅在将应用程序部署到特定生产服务器时可用的URL。但是这样做意味着在运行测试时代码区域无法访问,这让我有点不舒服。
在开发环境中,我并不关心拨打methodA
的问题,因为我会剔除methodA
将返回的内容并将其传递给下一个Controller,因此,将if语句更改为if(Environment.Current != Environment.DEVELOPMENT)
可以让我更好地测试代码,而不必调用我在开发期间无法访问的地方。
理想情况下,我想尝试将服务注入到依赖于grails环境的Controller中;所以我可以有两个这样的服务:
class RestService {
def methodA() {
// go do a REST call
}
}
和
class FakeRestService() {
def methodA() {
// return some stubbed response
}
}
在我的控制器restService
中将是开发和测试环境中FakeRestService
的实例,以及PRODUCTION中RestService
的实例
class SearchController {
def restService
def index() {
restService.methodA()
}
我对如何用Grailsy' / Spring方式实现这一目标感到有些困惑。我一直在寻找创建某种服务工厂,它会根据环境返回RestService
或FakeRestService
的实例,但如果我能定义要注入的服务,那将会很好在配置中的restService
或类似的东西。
任何建议都会很棒!
答案 0 :(得分:3)
当环境为TEST时,您可以在resources.groovy
中为bean名称添加别名。
import grails.util.Environment
beans = {
if ( Environment.current == Environment.TEST ) {
springConfig.addAlias 'restService', 'fakeRestService'
}
}
RuntimeSpringConfiguration
位于resources.groovy getSpringConfig()
。
答案 1 :(得分:0)
这是dmahapatro答案的更多Grails-y版本:
import grails.util.Environment
beans = {
Environment.executeForCurrentEnvironment {
environments {
development {
springConfig.addAlias 'restService', 'fakeRestService'
}
}
}
}