With Grails 3.1.9 and above we now get a default port for Functional tests that is randomly assigned. This is a great feature that was added in with this commit.

While this is a nice addition our tests which were not using Geb were left broken this is due to the fact we now need to know what port was selected for a given run of the tests. So our old test:

@Integration
class UserEndpointSpec extends Specification {
def “POST new user”() {
given:
ResponseEntity<Map> resp
RestTemplate restTemplate = new RestTemplate()
def requestBody = [
email: phil@aol.com,
fullName: ‘Phil’,
password: ‘password’,
username: ‘phil’
]
when:
resp = restTemplate.postForEntity(http://localhost:8080/users, requestBody, Map)
then:
resp.statusCode == HttpStatus.NO_CONTENT
}
}

Was broken since the app no longer started on 8080, but we can fix that with a new property that the @Integration annotation adds which is serverPort so the test becomes:

@Integration
class UserEndpointSpec extends Specification {
def “POST new user”() {
given:
ResponseEntity<Map> resp
RestTemplate restTemplate = new RestTemplate()
def requestBody = [
email: phil@aol.com,
fullName: ‘Phil’,
password: ‘password’,
username: ‘phil’
]
when:
resp = restTemplate.postForEntity(http://localhost:$&#x7b;serverPort&#x7d;/users, requestBody, Map)
then:
resp.statusCode == HttpStatus.NO_CONTENT
}
}

If you are wondering how serverPort is actually set you can see it happening inside IntegrationTestMixinTransformation. It will add a property to the test class with the port.

Comments