Ricardo
Ricardo

Reputation: 1621

Micronaut + Vertx + testcontainers

How do I configure Micronaut app using Vert.x and testcontainers? I'm trying:

application-test.yml

datasources:
  default:
    url: jdbc:tc:mysql:8:///db
    driverClassName: org.testcontainers.jdbc.ContainerDatabaseDriver
vertx:
  mysql:
    client:
      uri: jdbc:tc:mysql:8:///db

Tests with micronaut-data-jdbc work, but with micronaut-vertx-mysql-client not work:

Error:

Message: Cannot parse invalid connection URI: jdbc:tc:mysql:8:///db

I'm not very familiar with testecontainers, but it seems like it doesn't come up with a fixed port, so I don't know how to configure the connection URI.

Thanks!

Upvotes: 3

Views: 564

Answers (2)

Ricardo
Ricardo

Reputation: 1621

I got a solution to the problem:

Micronaut + jdbc hikari + vertx mysql client + flyway mysql

package br.com.app;

import io.micronaut.context.ApplicationContext;
import io.micronaut.context.env.PropertySource;
import io.micronaut.core.util.CollectionUtils;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.HttpStatus;
import io.micronaut.http.client.HttpClient;
import io.micronaut.runtime.EmbeddedApplication;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.MySQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
class AuthTest {

 static Logger log = LoggerFactory.getLogger(AuthTest.class.getName());

    @Container
    static MySQLContainer mysql = new MySQLContainer("mysql:8");

    private HttpClient client;
    private static EmbeddedApplication application;
    private static ApplicationContext context;

    @BeforeAll
    public static void initTests(){

        log.info("Mysql is running {}, port {}", mysql.isRunning(), mysql.getFirstMappedPort());

        var port = mysql.getFirstMappedPort();
        var host = mysql.getHost();
        var database = mysql.getDatabaseName();
        var user = mysql.getUsername();
        var password = mysql.getPassword();
        var url = String.format("jdbc:mysql://%s:%s/%s", host, port, database);

        application = ApplicationContext.run(EmbeddedApplication.class,
                PropertySource.of(
                        "test",
                        CollectionUtils.mapOf(
                            "vertx.mysql.client.port", port,
                            "vertx.mysql.client.host", host,
                            "vertx.mysql.client.database", database,
                            "vertx.mysql.client.user", user,
                            "vertx.mysql.client.password", password,
                            "datasources.default.url", url,
                            "datasources.default.username", user,
                            "datasources.default.password", password,
                            "flyway.datasources.default.enabled", true
                        )
                ));
        context = application.getApplicationContext();
    }

    @BeforeEach
    void beforeEach(){
        this.authService = context.getBean(AuthService.class);
        this.client = context.getBean(HttpClient.class);
    }    

    @Test
    void testItWorks() {
        Assertions.assertTrue(application.isRunning());
    }

   // api tests
}

Help links:

https://dev.to/major13ua/micronaut-integration-testing-using-testcontainers-2e30

https://github.com/major13ua/micronaut-tc/blob/main/src/test/java/com/example/testcontainer/controller/DemoControllerTest.java

Upvotes: 1

Kevin Wittek
Kevin Wittek

Reputation: 1572

It might be a problem that micronaut-vertx-mysql-client does not support the Testcontainers JDBC URL scheme (hard to say without further logs).

In this case, I would suggest to use Testcontainers with database container objects instead of the special JDBC URL.

Upvotes: 3

Related Questions