Spring JUnit 5 ExtendWith TestContainer

Posted

技术标签:

【中文标题】Spring JUnit 5 ExtendWith TestContainer【英文标题】: 【发布时间】:2021-10-27 15:35:53 【问题描述】:

我正在尝试重新利用一个容器,并且我正在尝试使用 JUnit5 ExtendWith 功能,但我仍然得到:

与 localhost:5432 的连接被拒绝。

如果我在每个测试中都有相同的逻辑,那么一切都会按预期工作。

@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);
  

扩展:

 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();
    


【问题讨论】:

【参考方案1】:

据我所知@DynamicPropertySource 只能在测试类本身或超类中使用。您必须将 properties 方法移过来。

【讨论】:

以上是关于Spring JUnit 5 ExtendWith TestContainer的主要内容,如果未能解决你的问题,请参考以下文章

@ExtendWith(SpringExtension.class) 不工作

何时使用 @RunWith 以及何时使用 @ExtendWith

Junit实现执行条件,以编程方式禁用测试功能

未解决的参考:SpringExtension 使用 @ExtendWith 注释

无法在使用 @ExtendWith(SpringExtension.class) 运行的 Spring Boot 单元测试中注入应用程序上下文

使用 JUnit 5 的 spring-boot-starter-test