From add734b640420b8fe917d8f56e6e727579dffac3 Mon Sep 17 00:00:00 2001 From: Walter Duque de Estrada Date: Fri, 16 Oct 2026 20:49:23 -0500 Subject: [PATCH] refactor(testing-support): idiomatic Groovy cleanup of the J2G output Behaviour-preserving idiom pass over 7 of the 17 files in scope for grails-test-suite-base, grails-test-suite-web, and grails-testing-support-web (the rest, including the Hibernate-proxy mock classes and MockHibernateProxyHandler, were left untouched per the task's own caution about test-double/mock classes deliberately deviating from normal behavior, or were already idiomatic). Applied: - map/list literals ([:], []) instead of new HashMap<>()/new ArrayList<>() - property syntax for unambiguous getters/setters - map read/write via bracket notation - String.equals() -> ==, .add()/<<, GString instead of string concatenation - collapsed Author's redundant explicit getter/setter pairs into Groovy properties (same public API: a getter+setter per field, just via shorthand) Verification: compileGroovy/compileTestGroovy clean across all 4 touched modules; codenarcMain 0 violations in grails-test-suite-base, grails-testing-support-web, grails-testing-support-core; full test 73/73 passing, 0 failures/errors. Co-Authored-By: Claude Sonnet 5 --- .../util/MockRequestDataValueProcessor.groovy | 6 +-- .../test/AbstractGrailsMockTests.groovy | 6 +-- .../support/MockApplicationContext.groovy | 54 +++++++++---------- .../support/MockApplicationContextSpec.groovy | 17 ++++++ .../org/grails/web/converters/Author.groovy | 20 +------ .../GroovyPageUnitTestResourceLoader.groovy | 10 ++-- .../support/LazyTagLibraryLookup.groovy | 34 ++++++------ 7 files changed, 71 insertions(+), 76 deletions(-) diff --git a/grails-test-suite-base/src/main/groovy/grails/util/MockRequestDataValueProcessor.groovy b/grails-test-suite-base/src/main/groovy/grails/util/MockRequestDataValueProcessor.groovy index 010386b3ddc..f99b420fcb9 100644 --- a/grails-test-suite-base/src/main/groovy/grails/util/MockRequestDataValueProcessor.groovy +++ b/grails-test-suite-base/src/main/groovy/grails/util/MockRequestDataValueProcessor.groovy @@ -28,7 +28,7 @@ import org.springframework.web.servlet.support.RequestDataValueProcessor class MockRequestDataValueProcessor implements RequestDataValueProcessor { Map getExtraHiddenFields(HttpServletRequest request) { - Map extraHiddenFields = new HashMap<>() + Map extraHiddenFields = [:] extraHiddenFields.put('requestDataValueProcessorHiddenName', 'hiddenValue') return extraHiddenFields } @@ -43,7 +43,7 @@ class MockRequestDataValueProcessor implements RequestDataValueProcessor { } String processFormFieldValue(HttpServletRequest request, String name, String value, String type) { - return value + '_PROCESSED_' + return "${value}_PROCESSED_" } String processUrl(HttpServletRequest request, String url) { @@ -54,7 +54,7 @@ class MockRequestDataValueProcessor implements RequestDataValueProcessor { toAppend = '?requestDataValueProcessorParamName=paramValue' } if (url.indexOf('#') > -1) { - url = url.replace('#', toAppend + '#') + url = url.replace('#', "${toAppend}#") } else { url = url + toAppend } diff --git a/grails-test-suite-base/src/main/groovy/org/grails/commons/test/AbstractGrailsMockTests.groovy b/grails-test-suite-base/src/main/groovy/org/grails/commons/test/AbstractGrailsMockTests.groovy index 500dcf1c73d..3b8a3387eea 100644 --- a/grails-test-suite-base/src/main/groovy/org/grails/commons/test/AbstractGrailsMockTests.groovy +++ b/grails-test-suite-base/src/main/groovy/org/grails/commons/test/AbstractGrailsMockTests.groovy @@ -60,12 +60,12 @@ abstract class AbstractGrailsMockTests extends GroovyTestCase { ctx = new MockApplicationContext() ctx.registerMockBean(GrailsApplication.CLASS_LOADER_BEAN, gcl) onSetUp() - ga = new DefaultGrailsApplication(gcl.getLoadedClasses(), gcl) + ga = new DefaultGrailsApplication(gcl.loadedClasses, gcl) if (ClassUtils.isPresent('Config', gcl)) { ConfigObject config = new ConfigSlurper().parse(gcl.loadClass('Config')) - ga.setConfig(new PropertySourcesConfig(config)) + ga.config = new PropertySourcesConfig(config) } - ga.setApplicationContext(ctx) + ga.applicationContext = ctx ga.initialise() ctx.registerMockBean(GrailsApplication.APPLICATION_ID, ga) postSetUp() diff --git a/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.groovy b/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.groovy index f14f4f5c7f6..d12072603f3 100644 --- a/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.groovy +++ b/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.groovy @@ -87,7 +87,7 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati void unregisterMockResource(String location) { for (Iterator it = resources.iterator(); it.hasNext();) { MockResource mockResource = (MockResource) it.next() - if (mockResource.location.equals(location)) { + if (mockResource.location == location) { it.remove() } } @@ -147,7 +147,7 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati } String[] getBeanDefinitionNames() { - return beans.keySet().toArray(new String[beans.keySet().size()]) + return beans.keySet() as String[] } @Override @@ -172,13 +172,13 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati @SuppressWarnings([ 'unchecked', 'rawtypes' ]) String[] getBeanNamesForType(Class type) { - List beanNames = new ArrayList<>() + List beanNames = [] for (String beanName in beans.keySet()) { - if (type.isAssignableFrom(beans.get(beanName).getClass())) { - beanNames.add(beanName) + if (type.isAssignableFrom(beans[beanName].getClass())) { + beanNames << beanName } } - return beanNames.toArray(new String[beanNames.size()]) + return beanNames as String[] } @SuppressWarnings('rawtypes') @@ -189,11 +189,8 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati @SuppressWarnings('unchecked') def Map getBeansOfType(Class type) throws BeansException { String[] beanNames = getBeanNamesForType(type) - Map newMap = new HashMap<>() - for (int i = 0; i < beanNames.length; i++) { - String beanName = beanNames[i] - newMap.put(beanName, (T) getBean(beanName)) - } + Map newMap = [:] + beanNames.each { String beanName -> newMap.put(beanName, (T) getBean(beanName)) } return newMap } @@ -203,10 +200,7 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati def A findAnnotationOnBean(String name, Class annotation) { Object o = getBean(name) - if (o != null) { - return o.getClass().getAnnotation(annotation) - } - return null + return o?.getClass()?.getAnnotation(annotation) } @Override @@ -215,9 +209,9 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati } Map getBeansWithAnnotation(Class annotation) throws BeansException { - Map submap = new HashMap<>() + Map submap = [:] for (Object beanName in beans.keySet()) { - Object bean = beans.get(beanName) + Object bean = beans[beanName] if (bean != null && bean.getClass().getAnnotation(annotation) != null) { submap.put(beanName.toString(), bean) } @@ -239,21 +233,21 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati * @since 2.4 */ String[] getBeanNamesForAnnotation(Class annotationType) { - List beanNamesList = new ArrayList<>() + List beanNamesList = [] for (Object beanName in beans.keySet()) { - Object bean = beans.get(beanName) + Object bean = beans[beanName] if (bean != null && bean.getClass().getAnnotation(annotationType) != null) { - beanNamesList.add(beanName.toString()) + beanNamesList << beanName.toString() } } - return beanNamesList.toArray(new String[beanNamesList.size()]) + return beanNamesList as String[] } Object getBean(String name) throws BeansException { if (!beans.containsKey(name)) { throw new NoSuchBeanDefinitionException(name) } - return beans.get(name) + return beans[name] } @SuppressWarnings('unchecked') @@ -262,11 +256,11 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati throw new NoSuchBeanDefinitionException(name) } - if (requiredType != null && !requiredType.isAssignableFrom(beans.get(name).getClass())) { + if (requiredType != null && !requiredType.isAssignableFrom(beans[name].getClass())) { throw new NoSuchBeanDefinitionException(name) } - return (T) beans.get(name) + return (T) beans[name] } @Override @@ -323,7 +317,7 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati throw new NoSuchBeanDefinitionException(name) } - return beans.get(name).getClass() + return beans[name].getClass() } @Override @@ -369,19 +363,19 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati } locationPattern = GrailsStringUtils.trimStart(locationPattern, '/') // starting with "**/" is OK - List result = new ArrayList<>() + List result = [] for (Resource res in resources) { - String path = res instanceof ClassPathResource ? ((ClassPathResource) res).getPath() : res.getDescription() + String path = res instanceof ClassPathResource ? ((ClassPathResource) res).path : res.description if (pathMatcher.match(locationPattern, path)) { - result.add(res) + result << res } } - return result.toArray(new Resource[0]) + return result as Resource[] } Resource getResource(String location) { for (Resource mockResource in resources) { - if (pathMatcher.match(mockResource.getDescription(), GrailsStringUtils.trimStart(location, '/'))) { + if (pathMatcher.match(mockResource.description, GrailsStringUtils.trimStart(location, '/'))) { return mockResource } } diff --git a/grails-test-suite-base/src/test/groovy/org/grails/support/MockApplicationContextSpec.groovy b/grails-test-suite-base/src/test/groovy/org/grails/support/MockApplicationContextSpec.groovy index 33b5b66b3b2..6605a938fc1 100644 --- a/grails-test-suite-base/src/test/groovy/org/grails/support/MockApplicationContextSpec.groovy +++ b/grails-test-suite-base/src/test/groovy/org/grails/support/MockApplicationContextSpec.groovy @@ -142,6 +142,19 @@ class MockApplicationContextSpec extends Specification { thrown(UnsupportedOperationException) } + void 'annotated beans are found by name and listed, unannotated beans are not'() { + given: + def annotatedBean = new AnnotatedMockBean() + ctx.registerMockBean('annotated', annotatedBean) + ctx.registerMockBean('plain', 'plainBean') + + expect: + ctx.findAnnotationOnBean('annotated', Deprecated) != null + ctx.findAnnotationOnBean('plain', Deprecated) == null + ctx.getBeansWithAnnotation(Deprecated) == [annotated: annotatedBean] + ctx.getBeanNamesForAnnotation(Deprecated) == ['annotated'] as String[] + } + void 'identity and environment accessors report the mock defaults'() { expect: ctx.id == 'MockApplicationContext' @@ -162,3 +175,7 @@ class MockApplicationContextSpec extends Specification { } } + +@Deprecated +class AnnotatedMockBean { +} diff --git a/grails-test-suite-web/src/test/groovy/org/grails/web/converters/Author.groovy b/grails-test-suite-web/src/test/groovy/org/grails/web/converters/Author.groovy index 62097ce50b4..8f8de03b39c 100644 --- a/grails-test-suite-web/src/test/groovy/org/grails/web/converters/Author.groovy +++ b/grails-test-suite-web/src/test/groovy/org/grails/web/converters/Author.groovy @@ -23,27 +23,11 @@ package org.grails.web.converters * Created by jameskleeh on 2/7/17. */ class Author { - private String name - private Integer age + String name + Integer age Author(String name, Integer age) { this.name = name this.age = age } - - String getName() { - return name - } - - void setName(String name) { - this.name = name - } - - Integer getAge() { - return age - } - - void setAge(Integer age) { - this.age = age - } } diff --git a/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/GroovyPageUnitTestResourceLoader.groovy b/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/GroovyPageUnitTestResourceLoader.groovy index 40dab8954a5..6c9d2527b9e 100644 --- a/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/GroovyPageUnitTestResourceLoader.groovy +++ b/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/GroovyPageUnitTestResourceLoader.groovy @@ -60,11 +60,11 @@ class GroovyPageUnitTestResourceLoader extends DefaultResourceLoader implements location = location.substring(WEB_INF_PREFIX.length()) } if (groovyPages.containsKey(location)) { - return new ByteArrayResource(groovyPages.get(location).getBytes(StandardCharsets.UTF_8), location) + return new ByteArrayResource(groovyPages[location].getBytes(StandardCharsets.UTF_8), location) } if (basePath == null) { - String basedir = BuildSettings.BASE_DIR.getAbsolutePath() + String basedir = BuildSettings.BASE_DIR.absolutePath basePath = basedir + File.separatorChar + GrailsResourceUtils.VIEWS_DIR_PATH } @@ -75,7 +75,7 @@ class GroovyPageUnitTestResourceLoader extends DefaultResourceLoader implements private String makeCanonical(String path) { try { - return new File(path).getCanonicalPath() + return new File(path).canonicalPath } catch (IOException e) { return path } @@ -88,8 +88,8 @@ class GroovyPageUnitTestResourceLoader extends DefaultResourceLoader implements @Override void afterPropertiesSet() throws Exception { - if (grailsApplication != null) { - Config config = grailsApplication.getConfig() + if (grailsApplication) { + Config config = grailsApplication.config String viewDir = config.getProperty(Settings.GSP_VIEWS_DIR) if (viewDir != null) { basePath = viewDir diff --git a/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/LazyTagLibraryLookup.groovy b/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/LazyTagLibraryLookup.groovy index 06c5b5c49c5..4ac939c3657 100644 --- a/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/LazyTagLibraryLookup.groovy +++ b/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/LazyTagLibraryLookup.groovy @@ -41,20 +41,20 @@ class LazyTagLibraryLookup extends TagLibraryLookup { private Map lazyLoadableTagLibs = new HashMap<>() LazyTagLibraryLookup() { - List mockedClasses = new ArrayList<>((List) new GroovyPagesGrailsPlugin().getProvidedArtefacts()) + List mockedClasses = new ArrayList<>((List) new GroovyPagesGrailsPlugin().providedArtefacts) ClassLoader classLoader = LazyTagLibraryLookup.getClassLoader() if (ClassUtils.isPresent('org.apache.grails.web.layout.LayoutGrailsPlugin', classLoader)) { // sitemesh2 support try { - mockedClasses.add(Class.forName('org.grails.plugins.web.taglib.GrailsLayoutTagLib')) - mockedClasses.add(Class.forName('org.grails.plugins.web.taglib.RenderGrailsLayoutTagLib')) + mockedClasses << Class.forName('org.grails.plugins.web.taglib.GrailsLayoutTagLib') + mockedClasses << Class.forName('org.grails.plugins.web.taglib.RenderGrailsLayoutTagLib') } catch (Exception ignored) { } } if (ClassUtils.isPresent('org.grails.plugins.sitemesh3.Sitemesh3GrailsPlugin', classLoader)) { try { - mockedClasses.add(Class.forName('org.grails.plugins.web.taglib.RenderSitemeshTagLib')) + mockedClasses << Class.forName('org.grails.plugins.web.taglib.RenderSitemeshTagLib') } catch (Exception ignored) { } @@ -99,11 +99,11 @@ class LazyTagLibraryLookup extends TagLibraryLookup { } catch (Exception ignored) { } - if (!hasNamespace(grailsTagLibClass.getNamespace())) { - registerNamespaceDispatcher(grailsTagLibClass.getNamespace()) + if (!hasNamespace(grailsTagLibClass.namespace)) { + registerNamespaceDispatcher(grailsTagLibClass.namespace) } - for (String tagName in grailsTagLibClass.getTagNames()) { - String tagKey = tagNameKey(grailsTagLibClass.getNamespace(), tagName) + for (String tagName in grailsTagLibClass.tagNames) { + String tagKey = tagNameKey(grailsTagLibClass.namespace, tagName) lazyLoadableTagLibs.put(tagKey, grailsTagLibClass) } } @@ -113,14 +113,14 @@ class LazyTagLibraryLookup extends TagLibraryLookup { GroovyObject tagLibrary = super.lookupTagLibrary(namespace, tagName) if (tagLibrary == null) { String tagKey = tagNameKey(namespace, tagName) - GrailsTagLibClass taglibClass = lazyLoadableTagLibs.get(tagKey) - if (taglibClass != null) { - if (!applicationContext.containsBean(taglibClass.getFullName())) { + GrailsTagLibClass taglibClass = lazyLoadableTagLibs[tagKey] + if (taglibClass) { + if (!applicationContext.containsBean(taglibClass.fullName)) { GenericBeanDefinition bd = new GenericBeanDefinition() - bd.setBeanClass(taglibClass.getClazz()) - bd.setAutowireCandidate(true) - bd.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME) - ((GenericApplicationContext) applicationContext).getDefaultListableBeanFactory().registerBeanDefinition(taglibClass.getFullName(), bd) + bd.beanClass = taglibClass.clazz + bd.autowireCandidate = true + bd.autowireMode = AbstractBeanDefinition.AUTOWIRE_BY_NAME + ((GenericApplicationContext) applicationContext).defaultListableBeanFactory.registerBeanDefinition(taglibClass.fullName, bd) } registerTagLib(taglibClass) tagLibrary = super.lookupTagLibrary(namespace, tagName) @@ -130,12 +130,12 @@ class LazyTagLibraryLookup extends TagLibraryLookup { } protected String tagNameKey(String namespace, String tagName) { - return namespace + ':' + tagName + return "${namespace}:${tagName}" } @Override protected void putTagLib(Map tags, String name, GrailsTagLibClass taglib) { - if (applicationContext.containsBean(taglib.getFullName())) { + if (applicationContext.containsBean(taglib.fullName)) { super.putTagLib(tags, name, taglib) } }