Details
Description
The GrailsUrlMappingsTestCase.assertView seems to be broken, since it cannot access grails-app/views via the classpath.
Given a newly created Grails application, the following test case, placed in test/integration:
class UrlMappingsTests extends grails.test.GrailsUrlMappingsTestCase {
void testViewMapping() { assertForwardUrlMapping('/', view:'index') }
}
cause the following stacktrace when running grails test-app:
java.io.FileNotFoundException: class path resource [grails-app/views/] cannot be resolved to URL because it does not exist
at grails.test.GrailsUrlMappingsTestCase.assertView(GrailsUrlMappingsTestCase.groovy:118)
at grails.test.GrailsUrlMappingsTestCase$assertView.callCurrent(Unknown Source)
at grails.test.GrailsUrlMappingsTestCase.assertForwardUrlMapping(GrailsUrlMappingsTestCase.groovy:149)
at grails.test.GrailsUrlMappingsTestCase$assertForwardUrlMapping$0.callCurrent(Unknown Source)
at grails.test.GrailsUrlMappingsTestCase.assertForwardUrlMapping(GrailsUrlMappingsTestCase.groovy:138)
at grails.test.GrailsUrlMappingsTestCase$assertForwardUrlMapping.callCurrent(Unknown Source)
at UrlMappingsTests.testViewMapping(UrlMappingsTests.groovy:4)
Looks like it is because the PathMatchingResourcePatternResolver used by assertView uses DefaultResourceLoader (which loads resources from the Classpath), and '.' doesn't seem to be on the classpath.
A workaround is to configure the PathMatchingResourcePatternResolver to use a FileSystemResourceLoader instead.
The modified test case below does this in setUp(), and hence the test executes correctly.
import org.springframework.core.io.FileSystemResourceLoader
import org.springframework.core.io.support.PathMatchingResourcePatternResolver
class UrlMappingsTests extends grails.test.GrailsUrlMappingsTestCase {
void setUp() { super.setUp() patternResolver = new PathMatchingResourcePatternResolver(new FileSystemResourceLoader()) }
void testViewMapping() { assertForwardUrlMapping('/', view:'index') }
}
As far as I can see, the GrailsUrlMappingsTestCase.patternResolver is only used by assertView, and hence this change could be made to GrailsUrlMappingsTestCase?
/Björn