I have an application with this structure: enter image description here
This is my test in user registration service, account service is - test-containers-account:1.0.6-SNAPSHOT, and this line .withEnv("SPRING_RABBITMQ_HOST", "any-other-host-not-local")
not override properties for container, it still try connect to localhost:port_of_rabbit-container. user registration service - succesfully connected to rabbit-mq (from logs: c.t.u.l.r.producer.AccountProducerImpl : Message with id [26d039f5-adfe-46f1-8640-75f3918660bc] send to [x.create-account-exchange] exchange with routing key [q.create-account-queue]):
class LearningApplicationTests {
@Autowired
UserRepository userRepository;
@Autowired
RabbitTemplate rabbitTemplate;
@Autowired
AccountProducer accountProducer;
public static final String RABBITMQ_IMAGE = "rabbitmq:3-management";
public static final String POSTGRES_IMAGE = "postgres:13-alpine";
public static final String ACCOUNT_IMAGE = "test-containers-account:1.0.6-SNAPSHOT";
static Network network = Network.newNetwork();
@LocalServerPort
private Integer port;
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>(POSTGRES_IMAGE);
static RabbitMQContainer rabbit = new RabbitMQContainer(RABBITMQ_IMAGE)
.withNetwork(network)
.withNetworkMode(network.getId())
.withNetworkAliases("rabbit-mq")
.withExposedPorts(5672);
@ClassRule
public static GenericContainer<?> account = new GenericContainer<>(DockerImageName.parse(ACCOUNT_IMAGE))
.withNetwork(network)
.withNetworkMode(network.getId())
.withEnv("SPRING_RABBITMQ_HOST", "rabbit-mq")
.withEnv("SPRING_RABBITMQ_PORT", "5672")
.dependsOn(rabbit);
@BeforeAll
static void beforeAll() {
rabbit.start();
postgres.start();
account.start();
}
@AfterAll
static void afterAll() {
rabbit.stop();
postgres.stop();
account.stop();
}
@DynamicPropertySource
static void configProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
// registry.add("spring.rabbitmq.host", rabbit::getHost);
registry.add("spring.rabbitmq.port", rabbit::getAmqpPort);
registry.add("spring.rabbitmq.username", rabbit::getAdminUsername);
registry.add("spring.rabbitmq.password", rabbit::getAdminPassword);
}
@BeforeEach
void setUp() {
RestAssured.baseURI = "http://localhost:" + port;
userRepository.deleteAll();
}
@Test
void userShouldHaveOneAccount() throws InterruptedException {
User user = new User();
user.setBirthday(OffsetDateTime.now());
user.setName("Bob");
user.setSurname("Green");
user.setAccount(null);
given()
.contentType(ContentType.JSON)
.when()
.body(user)
.post("api/user/create")
.then()
.statusCode(200)
.body("name", equalTo("Bob"))
.and()
.body("surname", equalTo("Green"));
User dbUser = userRepository.findAll().stream().findFirst().orElseThrow();
assertNotNull(dbUser);
assertEquals(1, dbUser.getId());
given()
.contentType(ContentType.JSON)
.when()
.get("api/user/" + dbUser.getId())
.then()
.statusCode(200)
.body("name", equalTo("Bob"))
.and()
.body("surname", equalTo("Green"))
.and()
.body("account", notNullValue());
}
}
I have this docker-compose.yml to run account in docker:
version: '3.7'
services:
testcontainers-db:
image: postgres:13-alpine
volumes:
- pg_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=123ewqasd
- POSTGRES_USER=test
- POSTGRES_DB=testcontainers
ports:
- "5432:5432"
rabbit-mq:
image: rabbitmq:3-management
ports:
- "15672:15672"
- "5672:5672"
account-service:
image: test-containers-account:1.0.6-SNAPSHOT
environment:
- SPRING_RABBITMQ_HOST=rabbit-mq
- SPRING_RABBITMQ_PORT=5672
- SPRING_RABBITMQ_USERNAME=guest
- SPRING_RABBITMQ_PASSWORD=guest
- SPRING_DATASOURCE_URL=jdbc:postgresql://testcontainers-db:5432/testcontainers
ports:
- "9011:9011"
depends_on:
- rabbit-mq
volumes:
pg_data:
Logs during test:
2023-12-20T10:10:18.190+01:00 INFO 265277 --- [ Test worker] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:33126]
2023-12-20T10:10:18.238+01:00 INFO 265277 --- [ Test worker] o.s.a.r.c.CachingConnectionFactory : Created new connection: rabbitConnectionFactory#1f15d346:0/SimpleConnection@6a73b74c [delegate=amqp://guest@0:0:0:0:0:0:0:1:33126/, localPort=57954]
2023-12-20T10:10:18.247+01:00 INFO 265277 --- [ Test worker] o.s.amqp.rabbit.core.RabbitAdmin : Auto-declaring a non-durable or auto-delete Exchange (x.create-account-exchange) durable:false, auto-delete:false. It will be deleted by the broker if it shuts down, and can be redeclared by closing and reopening the connection.
2023-12-20T10:10:18.247+01:00 INFO 265277 --- [ Test worker] o.s.amqp.rabbit.core.RabbitAdmin : Auto-declaring a non-durable or auto-delete Exchange (x.account-created-exchange) durable:false, auto-delete:false. It will be deleted by the broker if it shuts down, and can be redeclared by closing and reopening the connection.
2023-12-20T10:10:18.251+01:00 INFO 265277 --- [ Test worker] o.s.amqp.rabbit.core.RabbitAdmin : Auto-declaring a non-durable, auto-delete, or exclusive Queue (q.create-account-queue) durable:false, auto-delete:false, exclusive:false. It will be redeclared if the broker stops and is restarted while the connection factory is alive, but all messages will be lost.
2023-12-20T10:10:18.251+01:00 INFO 265277 --- [ Test worker] o.s.amqp.rabbit.core.RabbitAdmin : Auto-declaring a non-durable, auto-delete, or exclusive Queue (q.account-created-queue) durable:false, auto-delete:false, exclusive:false. It will be redeclared if the broker stops and is restarted while the connection factory is alive, but all messages will be lost.
2023-12-20T10:10:18.353+01:00 INFO 265277 --- [ Test worker] c.t.u.learning.LearningApplicationTests : Started LearningApplicationTests in 7.048 seconds (process running for 15.391)
2023-12-20T10:10:20.637+01:00 INFO 265277 --- [o-auto-1-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-12-20T10:10:20.638+01:00 INFO 265277 --- [o-auto-1-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2023-12-20T10:10:20.642+01:00 INFO 265277 --- [o-auto-1-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms
2023-12-20T10:10:20.901+01:00 INFO 265277 --- [o-auto-1-exec-1] c.t.u.l.r.producer.AccountProducerImpl : Message with id [26d039f5-adfe-46f1-8640-75f3918660bc] send to [x.create-account-exchange] exchange with routing key [q.create-account-queue]
java.lang.AssertionError: 1 expectation failed.
JSON path account doesn't match.
Expected: not null
Actual: null
2023-12-20T10:10:23.340+01:00 INFO 265277 --- [ntContainer#1-1] o.s.a.r.l.SimpleMessageListenerContainer : Restarting Consumer@3df920: tags=[[amq.ctag-HAqvlfIMEhM1HMc8lZumPQ]], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@0:0:0:0:0:0:0:1:33126/,2), conn: Proxy@7441eed3 Shared Rabbit Connection: SimpleConnection@6a73b74c [delegate=amqp://guest@0:0:0:0:0:0:0:1:33126/, localPort=57954], acknowledgeMode=AUTO local queue size=0
2023-12-20T10:10:23.342+01:00 INFO 265277 --- [ntContainer#1-2] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:33126]
2023-12-20T10:10:23.345+01:00 INFO 265277 --- [ntContainer#0-1] o.s.a.r.l.SimpleMessageListenerContainer : Restarting Consumer@9fe1e14: tags=[[amq.ctag-c0ocAKR_-6YBBf6gECDX5g]], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@0:0:0:0:0:0:0:1:33126/,1), conn: Proxy@7441eed3 Shared Rabbit Connection: null, acknowledgeMode=AUTO local queue size=0
2023-12-20T10:10:23.348+01:00 INFO 265277 --- [ntContainer#0-2] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:33126]
2023-12-20T10:10:23.344+01:00 ERROR 265277 --- [ntContainer#1-2] o.s.a.r.l.SimpleMessageListenerContainer : Failed to check/redeclare auto-delete queue(s).
org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:61) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:594) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:711) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createBareChannel(CachingConnectionFactory.java:662) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getCachedChannelProxy(CachingConnectionFactory.java:636) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getChannel(CachingConnectionFactory.java:526) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy.createChannel(CachingConnectionFactory.java:1423) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:2231) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2198) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2178) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueInfo(RabbitAdmin.java:465) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueProperties(RabbitAdmin.java:449) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.attemptDeclarations(AbstractMessageListenerContainer.java:1936) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.redeclareElementsIfNecessary(AbstractMessageListenerContainer.java:1904) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.initialize(SimpleMessageListenerContainer.java:1383) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1225) ~[spring-rabbit-3.1.0.jar:3.1.0]
at java.base/java.lang.Thread.run(Thread.java:1623) ~[na:na]
Caused by: java.net.ConnectException: Connection refused
at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:673) ~[na:na]
at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:540) ~[na:na]
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:590) ~[na:na]
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[na:na]
at java.base/java.net.Socket.connect(Socket.java:666) ~[na:na]
at com.rabbitmq.client.impl.SocketFrameHandlerFactory.create(SocketFrameHandlerFactory.java:61) ~[amqp-client-5.19.0.jar:5.19.0]
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1249) ~[amqp-client-5.19.0.jar:5.19.0]
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1198) ~[amqp-client-5.19.0.jar:5.19.0]
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.connectAddresses(AbstractConnectionFactory.java:632) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.connect(AbstractConnectionFactory.java:607) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:557) ~[spring-rabbit-3.1.0.jar:3.1.0]
... 15 common frames omitted
2023-12-20T10:10:23.351+01:00 INFO 265277 --- [ntContainer#1-2] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:33126]
2023-12-20T10:10:23.349+01:00 ERROR 265277 --- [ntContainer#0-2] o.s.a.r.l.SimpleMessageListenerContainer : Failed to check/redeclare auto-delete queue(s).
org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:61) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:594) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:711) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.createConnection(ConnectionFactoryUtils.java:257) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:2225) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2198) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2178) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueInfo(RabbitAdmin.java:465) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueProperties(RabbitAdmin.java:449) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.attemptDeclarations(AbstractMessageListenerContainer.java:1936) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.redeclareElementsIfNecessary(AbstractMessageListenerContainer.java:1904) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.initialize(SimpleMessageListenerContainer.java:1383) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1225) ~[spring-rabbit-3.1.0.jar:3.1.0]
at java.base/java.lang.Thread.run(Thread.java:1623) ~[na:na]
Caused by: java.net.ConnectException: Connection refused
at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:673) ~[na:na]
at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:540) ~[na:na]
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:590) ~[na:na]
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[na:na]
at java.base/java.net.Socket.connect(Socket.java:666) ~[na:na]
at com.rabbitmq.client.impl.SocketFrameHandlerFactory.create(SocketFrameHandlerFactory.java:61) ~[amqp-client-5.19.0.jar:5.19.0]
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1249) ~[amqp-client-5.19.0.jar:5.19.0]
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1198) ~[amqp-client-5.19.0.jar:5.19.0]
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.connectAddresses(AbstractConnectionFactory.java:632) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.connect(AbstractConnectionFactory.java:607) ~[spring-rabbit-3.1.0.jar:3.1.0]
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:557) ~[spring-rabbit-3.1.0.jar:3.1.0]
... 12 common frames omitted
2023-12-20T10:10:23.353+01:00 INFO 265277 --- [ntContainer#0-2] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:33126]
My task is - to test with Testcontainers to simulate real behavior. test-containers-account:1.0.6-SNAPSHOT and user registration service should comunicate with rabbit-mq in test env.