I am using testcontainers to create a mockserver in JUnit5.
It seems the port number changes for every run randomly, I want it to have a fix port number, which I will decide.
how this can be done ?
import kong.unirest.ContentType;
import kong.unirest.HttpStatus;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.mockserver.client.MockServerClient;
import org.mockserver.model.HttpResponse;
import org.mockserver.model.HttpStatusCode;
import org.testcontainers.containers.MockServerContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.shaded.com.google.common.net.HttpHeaders;
import org.testcontainers.utility.DockerImageName;
import java.nio.file.Path;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockserver.model.HttpRequest.request;
@Testcontainers
class Mocking {
@Container
private static final MockServerContainer mockServerContainer = new MockServerContainer(
DockerImageName.parse("mockserver/mockserver"));
private static MockServerClient mockServerClient;
private static String BASE_URL;
@BeforeAll
public static void initialize() {
mockServerClient = new MockServerClient(mockServerContainer.getHost(), mockServerContainer.getServerPort());
BASE_URL = mockServerContainer.getEndpoint();
System.out.println(BASE_URL);// its printing localhost:portnumber
//the portnumber is random for each run, I want it to be consistent
}
@BeforeEach
public void setup() {
mockServerClient.reset();
}
@Test
void helloWorldTest() {
Map<String, String> headers = Map.of(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType());
String expectedResponse = JsonHelper.toJsonString("Hello World!");
mockServerClient
.when(request().withMethod("GET")
.withHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType())
)
.respond(HttpResponse.response()
.withHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType())
.withStatusCode(HttpStatusCode.OK_200.code())
.withBody(expectedResponse)
);
Response response = HttpUtil.builder().baseUrl(BASE_URL).headers(headers).build().get(null).call();
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK);
assertThat(response.asString()).isEqualTo(expectedResponse);
}
}
The official documentation JavaDochas little to no info on this, I tried searching for some methods which can do so.
1
This is done on purpose and as far as I know, there is no way to set a fixed port.
Testcontainers don’t allow to set a fixed port because tests can be run concurrently in multiple threads, and in this case, whether there is a clash when trying to start several containers, or tests aren’t trully independent from eachother any longer if you execute several tests at once in the same container.
So even if you can set a fixed port, you probably shouldn’t, as you might encounter random clashes and/or failures.
1
Have you tried
mockServerContainer.addExposedPorts(9999)
?
from https://github.com/testcontainers/testcontainers-java/blob/main/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java