gpt4 book ai didi

grails - 在 Grails 中用于测试的不同 resources.xml?

转载 作者:行者123 更新时间:2023-11-28 21:10:12 27 4
gpt4 key购买 nike

我在 grailsApp/conf/spring 文件夹下有 resources.xml 并且所有的 bean 都被初始化了,但是我希望有不同的 bean 定义来测试和实际。

我可以有一个单独的 test-resources.xml 并仅在测试期间加载它,而在其他情况下加载 resources.xml 吗?

最佳答案

您是否局限于使用 XML 进行 bean 定义?使用 resources.groovy 是现在的首选方法,因为它提供了强大的 DSL根据环境定义 bean 很简单:

import grails.util.Environment

beans = {
switch(Environment.current) {
case Environment.TEST:
myBean(String, "test string")
break

case Environment.DEVELOPMENT:
myBean(String, "dev string")
break
}
}

您可以在 Grails and Spring 上的文档中查看更多示例.

选项 2

如果您不能将 Grails Spring DSL 用于 bean 定义,则可以使用一种混合方法。将 resources.xml 移出 conf/spring/ 和类路径中的其他位置。在它旁边,创建另一个 XML 文件,其中包含测试环境的 bean 定义,我们将其命名为 resources-test.xml。然后将 resources.groovy 文件添加到 conf/spring/ 中,如下所示:

import grails.util.Environment

beans = {

switch(Environment.current) {
case Environment.TEST:
importBeans('classpath:/resources-test.xml')
break

case Environment.DEVELOPMENT:
importBeans('classpath:/resources.xml')
break
}

}

这种方法允许您将 bean 定义保留在 XML 中,但利用 Grails Spring DSL 来切换环境。

选项 3

根据您在 resources.xml 中处理的 bean 的复杂性和数量,也许您可​​以使用 BeanFactoryPostProcessor . Spring 的 BeanFactoryPostProcessor 允许您在 beans 初始化之前 Hook 它们,以便您可以修改它们的定义。您需要在 src/groovy 中创建一个实现 BeanFactoryPostProcessor 的类,如下所示:

import grails.util.Environment
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
import org.springframework.beans.BeansException
import org.springframework.beans.factory.config.ConstructorArgumentValues

class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

@Override
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
if (Environment.current == Environment.TEST) {
BeanDefinition definition = beanFactory.getBeanDefinition('myBean')
ConstructorArgumentValues constructorArgs = definition.constructorArgumentValues
constructorArgs.clear()
constructorArgs.addGenericArgumentValue("Modified for test")
}
}
}

然后在resources.xml中注册:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="myBean" class="java.lang.String">
<constructor-arg value="this will be overwritten" />
</bean>

<bean id="postProcessor" class="CustomBeanFactoryPostProcessor" />
</beans>

这显然是一个非常简单的示例,但是在运行测试时,myBean 值将设置为 "Modified for test" 而不是 "this will be overwritten" .

选项 4

为每个环境单独定义 beans 的另一种方法是通过添加 doWithSpring 闭包来覆盖测试类本身内部的 beans:

static doWithSpring = {
myBean(String, 'Modified for test')
}

void "test bean is overridden"() {
expect:
grailsApplication.mainContext.getBean('myBean') == 'Modified for test'
}

关于grails - 在 Grails 中用于测试的不同 resources.xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33828103/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com