在我的Grails 2.2应用程序中,我做了一些计算,需要正确设置Locale。因此,我在我的应用程序中提供了此配置块,如其他地方所述。
grails-app/config/spring/resources.groovy
:
beans = {
localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) {
defaultLocale = new Locale("da","DK")
java.util.Locale.setDefault(defaultLocale)
}
}
现在,正如其他问题和答案所建议的那样,这适用于正在运行的应用程序的上下文,但不适用于单元测试。
我制作了这个片段以验证(在应用程序的页面上):
<h2>Locale settings</h2>
<p>The following properties relevant to Locale is configured:</p>
<pre>
LocaleContextHolder.locale: '${org.springframework.context.i18n.LocaleContextHolder.locale}'
java.util.Locale.getDefault(): '${java.util.Locale.getDefault()}'
RequestContextUtils.getLocale(request): '${org.springframework.web.servlet.support.RequestContextUtils.getLocale(request)}'
session['SessionLocaleResolver.LOCALE']: '${session['org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE']}'
</pre>
呈现
Locale settings
The following properties relevant to Locale is configured:
LocaleContextHolder.locale: 'da_DK'
java.util.Locale.getDefault(): 'da_DK'
RequestContextUtils.getLocale(request): 'da_DK'
session['SessionLocaleResolver.LOCALE']: ''
我的单元测试会出现问题(我需要java.util.Calendar周在星期一开始(默认为da_DK
,但是星期从星期日开始(默认为en_*
语言环境)。 / p>
在这种情况下,我做了两个测试用例:
在test/unit/DefaultLocaleSpec.groovy
:
import grails.test.mixin.TestMixin
import grails.test.mixin.web.ControllerUnitTestMixin
import org.codehaus.groovy.grails.plugins.testing.GrailsMockHttpServletRequest
import org.springframework.web.servlet.support.RequestContextUtils
import spock.lang.Specification
@TestMixin(ControllerUnitTestMixin)
class DefaultLocaleSpec extends Specification {
// ---------------------------------
// Locale verification (affects java Calendar calculations)
// ---------------------------------
def "locale (request) should be set to Danish, so that week starts Monday"() {
given:
GrailsMockHttpServletRequest request = new GrailsMockHttpServletRequest()
when:
Locale result = RequestContextUtils.getLocale(request)
then:
result == new Locale("da", "DK")
}
def "locale (default) should be set to Danish, so that week starts Monday"() {
when:
Locale result = java.util.Locale.getDefault()
then:
result == new Locale("da", "DK")
}
这两项测试失败,并显示以下消息:
Condition not satisfied:
result == new Locale("da", "DK")
| | |
en | da_DK
false
at DefaultLocaleSpec.locale (request) should be set to Danish, so that week starts Monday(DefaultLocaleSpec.groovy:27)
Condition not satisfied:
result == new Locale("da", "DK")
| | |
en_US | da_DK
false
<Click to see difference>
at DefaultLocaleSpec.locale (default) should be set to Danish, so that week starts Monday(DefaultLocaleSpec.groovy:35)
我找到的一个解决方法是将以下内容添加到单元测试文件中:
def setupSpec() {
java.util.Locale.setDefault(new Locale("da", "DK"))
}
我很想选择它作为解决方案,但是我可能必须将它添加到我的所有单元测试文件中以修复语言环境。似乎重复工作。我更喜欢我的代码干(不要重复自己)。
我喜欢避免,因为我需要做的一切就是修改我的设置,我的同事们也要学习。更少的定制更好。我可以放在应用程序中的越多,对我,我的同事和代码的任何维护者来说都越好:)
这指出了我的实际问题:我还想为单元测试环境设置正确的(默认)语言环境。怎么做 - 干嘛?
我更喜欢在一个全局影响我的应用的文件中进行一次更改。
这些相关问题并没有完全回答或解决我的问题(但有相关的想法)
resources.groovy
中设置区域设置解决所有问题,但不解决单元测试问题