Enterprise Java

X-Mas Musings – Do Not Use Random Server Port in Grails Integration Tests

December is for many people a period of reflection or thought. So I decided to reflect upon last year’s things and thoughts — each day until Christmas. This is day 4.

For a Grails integration test it is useful to know at what port your application is currently running.

Spring Boot — and consequently Grails which is built on top of it — exposes the at-startup-randomly-selected port through a property, called local.server.port.

When Googling it for Grails specifically, one usually comes on mrhaki’s Grails Goodness: Use Random Server Port In Integration Tests page — an excellent source of Grails Goodness – which clearly shows how to get the value of the local.server.port property using @Value.

You can see it in action below, in my own example.

import grails.plugins.rest.client.RestBuilder
import grails.plugins.rest.client.RestResponse
import grails.test.mixin.integration.Integration
import org.springframework.beans.factory.annotation.Value
import spock.lang.Specification

@Integration
class SomeIntegrationSpec extends Specification {

  @Value('${local.server.port}')
  Integer serverPort

  void "health check works"() {

    when:
    String url = "http://localhost:${serverPort}/example/health"
    def response = new RestBuilder().get(url)

    then:
    response.status == 200
  }
}

Somewhere last year I realized: I don’t need this at all.

@Integration
class SomeIntegrationSpec extends Specification {

  // no serverPort!

  void "health check works"() {

    when:
    String url = "http://localhost:${serverPort}/example/health"
    def response = new RestBuilder().get(url)

    then:
    response.status == 200
  }
}

WAT? No serverPort property — and you’re still using it in "http://localhost:${serverPort}/example/health"?

Jip, at least in Grails 3.3.0 this functionality, the exact property Integer serverPort initialized with the corrct value, is added to the test class directly by the @Integration annotation — specifically: its AST transformation helper class.

As Bristish fiction author Arthur C. Clarke already stated:

Any sufficiently advanced annotation is indistinguishable from magic.

So true.

Published on Java Code Geeks with permission by Ted Vinke, partner at our JCG program. See the original article here: X-Mas Musings #4 – Do Not Use Random Server Port in Grails Integration Tests

Opinions expressed by Java Code Geeks contributors are their own.

Ted Vinke

Ted is a Java software engineer with a passion for Web development and JVM languages and works for First8, a Java Web development company in the Netherlands.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button