当前位置: 首页 > 知识库问答 >
问题:

JUnit 5和带有不同扩展的继承,用于与TestContainers的Spring Boot集成测试

西门经国
2023-03-14

简介:我们的产品需要对3个不同的数据库进行集成测试:

  1. 甲骨文
  2. 博士后
  3. MSSQL

我们使用Spring Boot作为我们的框架和TestContainers来启动上面提到的数据库。

问题是:我们需要对每个容器(数据库)运行相同的测试

在网上挖掘了很多之后,我能想到的唯一方法是使用一个BaseClass,在那里我们编写所有的测试用例和每个容器,我们创建一个继承自BaseClass的类,我们覆盖这个方法并用@Test注释它。

在下面的代码中,您将看到一个用于Postgres的JUnit5扩展,它启动一个TestContainer、一个基本测试类,以及一个从Postgres扩展扩展得到的测试类,启动一个Spring应用程序上下文,并从基类运行测试。

代码:

import com.company.itest.AutoConfig;
import com.company.itest.BaseIntegrationTest;
import com.company.itest.db.mssql.MSSqlTest;
import com.company.itest.db.oracle.OracleTest;
import com.company.itest.db.postgres.PostgresTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

public class TestTheTest extends BaseIntegrationTest {
  public void contextLoads() {
    Assertions.assertEquals(1, 1);
  }
  public void contextLoads2() {
    Assertions.assertNotEquals(1, 2);
  }
}


@SpringBootTest(
    classes = AutoConfig.class,
    webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@PostgresTest
class TestPostgres extends TestTheTest {
  @Test
  public void contextLoads() {
    super.contextLoads();
  }
  @Test
  public void contextLoads2() {
    super.contextLoads2();
  }
}


import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.PostgreSQLContainer;

public class PostgresqlTestContainersExtension implements BeforeAllCallback, AfterAllCallback {

  private final Logger log = LoggerFactory.getLogger(PostgresqlTestContainersExtension.class);

  private PostgreSQLContainer<?> postgres;

  @Override
  public void beforeAll(ExtensionContext context) {
    log.info("Setting up postgres container");
    postgres = new PostgreSQLContainer<>("postgres:13").withReuse(true);

    postgres.start();
    System.setProperty("spring.datasource.url", postgres.getJdbcUrl());
    System.setProperty("spring.datasource.username", postgres.getUsername());
    System.setProperty("spring.datasource.password", postgres.getPassword());
  }

  @Override
  public void afterAll(ExtensionContext context) {
    postgres.stop();
  }
}



package com.company.itest.db.postgres;

import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.testcontainers.junit.jupiter.Testcontainers;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@ExtendWith(SpringExtension.class)
@ExtendWith({PostgresqlTestContainersExtension.class})
@Testcontainers
public @interface PostgresTest {}

问题是:

我如何创建一个JUnit测试类,然后使用不同的JUnit5扩展重新运行它,而不执行这种多态性?

共有1个答案

上官鸿晖
2023-03-14

如果您使用的是maven,那么可以尝试每db使用不同的配置文件

 类似资料:
  • 我正在尝试对停靠数据库运行DropWizard的集成测试。 DropWizard 测试容器 我试过的: 我得到由:java.lang.IllegalStateException引起的 将这些链接在一起也不起作用 最后,这是可行的,但据我所知,它在每次测试中都运行新的DropwizardAppRule,这是不好的... 那么,如何将规则链接起来,使PostgreSQLContainer首先启动,并且

  • 我有一个关于继承定义的理论问题。一个月前我参加了一个测试,我们必须举一个遗传的例子。 这是我的答案: 根据定义,extend关键字表示正在定义的类是使用继承从基派生的。然而,我的教授认为这个答案是错误的,因为我的例子是一个接口扩展,与继承无关。 接口扩展和继承有什么区别?为什么我的答案是错误的,我是否混淆了继承的定义?

  • 本文向大家介绍详解Vue2.0组件的继承与扩展,包括了详解Vue2.0组件的继承与扩展的使用技巧和注意事项,需要的朋友参考一下 前言 本文将介绍vue2.0中的组件的继承与扩展,主要分享slot、mixins/extends和extend的用法。 一、slot 1.默认插槽和匿名插槽 slot用来获取组件中的原内容,此方式用于父组件向子组件传递“标签数据”。有的时候为插槽提供默认的内容是很有用的,

  • 本文向大家介绍php类的扩展和继承用法实例,包括了php类的扩展和继承用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php类的扩展和继承用法。分享给大家供大家参考。具体如下: 希望本文所述对大家的php程序设计有所帮助。

  • 如果我为各种品牌的汽车建模,我会使用继承层次结构,还是仅仅改变构造函数参数? 关于是使用继承还是仅通过重复使用同一类来关联对象,一般的规则是什么? 对于汽车,我可以做一些像新车(“保时捷”、“991”、“3.8”)这样的事情,或者我可以有一个整体抽象的汽车超类,有像“保时捷”这样的抽象子类制造商,然后可能为保时捷的每个型号都有一个类?