mark dev
mark dev

Reputation: 91

Access field in a Rabbitmq testContainer extension class in junit5

I am using TestContainer to run RabbitMQ instance in order to use it in my integration tests.

I create a Junit 5 extension class that implement the BeforeAllCallback interface to run the container only once before my tests, to connect to the container i need to retrieve the mapped port that is exposed in my host machine, so i am wandering if there is any solution in order to access the extension class field from my integration test class.

The Extension

public  class RmqExtension implements BeforeAllCallback {
    private static final String DEFAULT_USER = "guest";
    private static final String DEFAULT_PASS = "guest";
    public static final int RABBIT_HTTP_API_PORT = 15672;
    private static final String RABBIT_MQ_IMAGE_NAME = "rmqImage";
    private static final String RABBIT_MQ_OVERVIEW_PATH = "/api/overview";

    private static final GenericContainer rabbitMqContainer = new GenericContainer(DockerImageName.parse(RABBIT_MQ_IMAGE_NAME))
            .withExposedPorts(RABBIT_HTTP_API_PORT)
            .waitingFor(Wait.forHttp(RABBIT_MQ_OVERVIEW_PATH).withBasicCredentials(DEFAULT_USER, DEFAULT_PASS).forStatusCode(HttpStatus.SC_OK));
   


    @Override
    public void beforeAll(ExtensionContext extensionContext) throws Exception {
        rabbitMqContainer.start();
    }

}

My test Class

@ExtendWith(RmqExtension.class)

class RabbitMqIT {
    
   private int myPort;

   @Test
   void myTest(){

      // What i need to do

      myPort = rabbitMqContainer.getMappedPort(15672);
     }
}

Upvotes: 2

Views: 509

Answers (1)

Kevin Wittek
Kevin Wittek

Reputation: 1582

I am unsure what is the most elegant JUnit-Jupiter-idiomatic way to do this, but if there is only 1 instance of the container per JVM process, you could either use a public static field or save it System Properties.

Also, see the Singleton Container Pattern for another example of how to do this without JUnit: https://www.testcontainers.org/test_framework_integration/manual_lifecycle_control/#singleton-containers

Upvotes: 0

Related Questions