Search code examples
spring-bootjunitjunit5testcontainerstestcontainers-junit5

Spring JUnit 5 ExtendWith TestContainer


I'm trying to reutilize a container and I'm trying to use JUnit5 ExtendWith feature but I'm still getting:

Connection to localhost:5432 refused.

If I have the same logic inside each test everything works as expected.

@Testcontainers
@SpringBootTest
@ExtendWith({PostgresTestContainersExtension.class})
public class ApplicationJUnit5Test {
  @Autowired
  private HeroClassicJDBCRepository repositoryUnderTest;

  @Test
  public void test1() {
    System.out.println("junit version: " + Version.id());
    Collection<Hero> heroes = repositoryUnderTest.allHeros();
    assertThat(heroes).hasSize(1);
    repositoryUnderTest.addHero(new Hero("bb", "bb"));
    Collection<Hero> heroesAfter = repositoryUnderTest.allHeros();
    assertThat(heroesAfter).hasSize(2);
  }
}

Extention:

 public class PostgresTestContainersExtension implements BeforeAllCallback,
BeforeTestExecutionCallback {

private static final String IMAGE_NAME = "registry.mycomp.com/db/mariadb:10.4.11";
@DynamicPropertySource
static void properties(DynamicPropertyRegistry registry) {
    registry.add("spring.datasource.url", container::getJdbcUrl);
    registry.add("spring.datasource.password", container::getPassword);
    registry.add("spring.datasource.username", container::getUsername);
}
@Container
public static PostgreSQLContainer container = new PostgreSQLContainer()
    .withUsername("duke")
    .withPassword("password")
    .withDatabaseName("test");

@Override
public void beforeAll(ExtensionContext extensionContext) {
    startContainerIfNeed();
}

@Override
public void beforeTestExecution(ExtensionContext extensionContext) {
    startContainerIfNeed();
}

public void startContainerIfNeed() {
    if (!container.isRunning()) {
        container.start();
    }
}
}

Solution

  • As far as I know @DynamicPropertySource can only be used in the test class itself or a superclass. You’ll have to move the properties method over.