Testcontainers - communication between containers in tests with Spring Boot and Testcontainers

108 Views Asked by At

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.

0

There are 0 best solutions below