Testing Grails集成测试失败,因为在引导过程中获取了i18n消息
我在Grails 4.0.1应用程序中添加了对Testing Grails集成测试失败,因为在引导过程中获取了i18n消息,testing,grails,internationalization,Testing,Grails,Internationalization,我在Grails 4.0.1应用程序中添加了对Boostrap.groovy的服务方法调用: @GrailsCompileStatic class BootStrap { GrailsApplication grailsApplication SelfAssessmentRatingService selfAssessmentRatingService def init = { servletContext -> TimeZone.setDefa
Boostrap.groovy
的服务方法调用:
@GrailsCompileStatic
class BootStrap {
GrailsApplication grailsApplication
SelfAssessmentRatingService selfAssessmentRatingService
def init = { servletContext ->
TimeZone.setDefault(TimeZone.getTimeZone("UTC"))
...
SelfAssessmentRating rating = SelfAssessmentRating.first()
if (!rating) {
selfAssessmentRatingService.createRatingsFromConfig()
}
}
def destroy = {
}
}
在服务方法中,为我在应用程序配置中的setup.selfAssessmentRatings
中指定的每个对象获取一条i18n消息
@GrailsCompileStatic
@Slf4j
@Transactional
class SelfAssessmentRatingService implements GrailsConfigurationAware {
MessageSource messageSource
List<Map> setupAssessmentRatings
@Override
void setConfiguration(Config co) {
List selfAssessmentRatings = co.getProperty('setup.selfAssessmentRatings', List, null)
setupAssessmentRatings = selfAssessmentRatings as List<Map>
}
/**
* Saves a SelfAssessmentRating record for each one specified in the application config.
* This method gets called if there are no SelfAssessmentRating records saved.
*/
def createRatingsFromConfig() {
if (setupAssessmentRatings == null || setupAssessmentRatings.empty) {
log.info("Skipping creating SelfAssessmentRatings because none were specified " +
"in the config: 'setup.selfAssessmentRatings'")
return
}
log.info("Saving ${setupAssessmentRatings.size()} new SelfAssessmentRating records")
for (Map map in setupAssessmentRatings) {
// SelfAssessmentRating is a domain class
SelfAssessmentRating newRating = new SelfAssessmentRating()
newRating.rating = map.rating as Integer
newRating.englishText = map.englishText
newRating.translationKey = map.translationKey
newRating.save(failOnError: true)
// Verify we have that translation. This will throw an exception if the translation is not present.
messageSource.getMessage(newRating.translationKey, [].toArray(), Locale.default)
}
}
}
我在grails app/i18n/messages.properties中定义了这三条消息:
example.selfAssessment.noExperience=No Experience or Knowledge
example.selfAssessment.someExperience=Some Experience or Knowledge
example.selfAssessment.functionIndependently=Able to function independently in this area
我的集成测试都通过了CircleCI(/gradlew-Dgrails.env=CircleCI integrationTest
),但在我的本地计算机上,每次集成测试都会出现以下错误:
org.springframework.context.NoSuchMessageException: No message found under code 'example.selfAssessment.noExperience' for locale 'en_US'.
at org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:161)
at com.hclabs.ojt.step.SelfAssessmentRatingService.$tt__createRatingsFromConfig(SelfAssessmentRatingService.groovy:46)
有人知道如何让集成测试在本地再次通过吗
在本地计算机上调用
/gradlew integrationTest
时,是否可以添加参数或设置环境变量,以便Grails可以在Grails app/i18n/messages.properties
中找到消息?我试图重现该行为,但无法执行。请参阅上的项目。如果你能发送一个PR给那个演示问题的人,这将使故障排除变得更容易。事实证明这不是问题。我刚刚删除了项目中的.gradle目录,并重新运行了集成测试,结果通过了。谢谢你调查此事。
org.springframework.context.NoSuchMessageException: No message found under code 'example.selfAssessment.noExperience' for locale 'en_US'.
at org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:161)
at com.hclabs.ojt.step.SelfAssessmentRatingService.$tt__createRatingsFromConfig(SelfAssessmentRatingService.groovy:46)