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

使用testcontainers postgresql进行Spring Boot测试

冯浩旷
2023-03-14
src
   |
   main
   test
        |
        resources
                |
                application-test.properties
                schema.sql
                data.sql

相关pom.xml

<properties>
    <java.version>11</java.version>
    <testcontainers.version>1.15.1</testcontainers.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.11.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.11</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.4</version>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20201115</version>
    </dependency>
    

    <dependency>
        <groupId>org.testcontainers</groupId>
        <artifactId>testcontainers</artifactId>
        <version>${testcontainers.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.testcontainers</groupId>
        <artifactId>localstack</artifactId>
        <version>${testcontainers.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.testcontainers</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>${testcontainers.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.testcontainers</groupId>
        <artifactId>postgresql</artifactId>
        <version>${testcontainers.version}</version>
        <scope>test</scope>
    </dependency>

</dependencies> 

我的测试类:

@Testcontainers
@Sql(scripts = {"file:src/test/resources/schema.sql","file:src/test/resources/data.sql"})
class ApplicationTests {

    @Container
    static PostgreSQLContainer<?> postgreSQLContainer = new PostgreSQLContainer<>("postgres:12")
            .withUsername("testcontainers")
            .withPassword("testcontainers")
            .withDatabaseName("tescontainers");


    @Test
    void testPostgreSQLModule() throws SQLException {
        try (Connection connection = DriverManager
                .getConnection(postgreSQLContainer.getJdbcUrl(), "testcontainers", "testcontainers");
             PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM table_from_schema")) {
            try (ResultSet resultSet = preparedStatement.executeQuery()) {
                while (resultSet.next()) {
                    System.out.println(resultSet.getString("column1"));
                }
            }
        }
    }
}   

我只是在试着测试数据库。

org.postgresql.util.PSQLException: ERROR: relation "table_from_schema" does not exist
$ docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                     NAMES
fc3ff1e04ceb        postgres:12                 "docker-entrypoint.s…"   16 seconds ago      Up 15 seconds 
tescontainers=# \dt
Did not find any relations.
tescontainers=# 

类级别上的@SQL注释不能像我的情况那样与Testcontainers初始化一起工作吗?

这里需要什么使我的两个初始脚本都运行?

我尝试使用.WithInitScript,它运行了。但是,我有很多数据要初始化,而且文件太大(而且会增长),所以我将DDL(模式)和Inserts(数据)分开。现在,我的问题是如何使用“WithInitScript”运行多个init文件(schema.sql、data.sql)?所以我尝试了@SQL注释,但似乎不起作用。

    null

共有1个答案

养学
2023-03-14

我猜你错过了以下几点

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>test</scope>
</dependency>

测试依赖关系。(或完全删除。)

Table not found错误通常表示模式和模型与可用驱动程序不匹配。

 类似资料:
  • 我想测试我的SpringBoot应用程序,它使用cassandra作为CrudRepository。我最终得到了 具有 和 这就导致了 如果我使用旧版本的cassandra-unit-Spring 它以NullPointerException结束,因为没有注入值repo。 来源https://github.com/StephanPraetsch/spring.boot.cassandra.unit

  • 我正在springboot应用程序中编写Junits,它只有一个初始化器类 以及其他控制器和服务类。 服务类的Junit如下所示: 当我运行Junit时,它会抛出如下错误: 我还尝试了所有注释,如,@ContextConfiguration(classes=Initializer.class),,但它仍会抛出相同的错误。代码中没有其他类似于应用程序上下文的配置类。

  • 我正在用Cucumber编写验收测试,我想使用H2数据库进行测试。 应用程序测试属性如下所示: 在目录resources/db/migration中,我有一个包含这些脚本的sql文件: 但是当我运行测试时,H2用默认格式创建模式,而不是使用脚本: 如您所见,所有VARCHAR都是使用255大小创建的,而不是真实值。 你能帮我把飞行道和H2整合起来吗? 谢谢!

  • 我有几个繁重的Spring集成测试(是的,这不是最好的方法,我没有时间正确地模拟所有外部dep) 下面是测试的典型注释 由于以下原因,测试会定期失败: 这里有两个问题:1、让测试共存的正确方式是什么?我在surefire插件中设置了forkCount=0。好像有帮助 2.1. 在每次测试期间,我实际上不需要启动所有的

  • 本文向大家介绍SpringBoot使用POI进行Excel下载,包括了SpringBoot使用POI进行Excel下载的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了SpringBoot使用POI进行Excel下载的具体代码,供大家参考,具体内容如下 使用poi处理Excel特别方便,此处将处理Excel的代码分享出来。 1.maven引用 2.service逻辑代码 3.contr

  • 简介 在之前的章节我们实现了一个简单但是功能齐全的web项目、学习了如何使用Gradle来构建和运行这个项目。测试代码是软件开发周期中非常重要的一环,能够确保软件的行为能符合预期。这一章我将讲述如何使用Gradle来组织、配置和执行测试代码,学习如何写单元测试、集成测试和功能测试并把他们集成到项目构建中。 Gradle集成了很多Java和Groovy测试框架,在本章的最后你会用JUnit、Test

  • 本节课将介绍如何使用specs —— 一个Scala行为驱动设计(BDD)框架,来进行测试。 扩展规格 让我们直接开始。 import org.specs._ object ArithmeticSpec extends Specification { "Arithmetic" should { "add two numbers" in { 1 + 1 mustEqual