Java 用于spring boot应用程序中集成测试的内存中数据库配置(HSQLDB)

Java 用于spring boot应用程序中集成测试的内存中数据库配置(HSQLDB),java,spring-boot,integration-testing,hsqldb,Java,Spring Boot,Integration Testing,Hsqldb,我开发了一个系统,其基础架构层是在Spring boot上开发的(安全性、数据JPA、MVC…)。在运行时,系统连接到MySQL,MySQL的设置位于src/main/resources/application.properties以及包含一些用户插入和身份验证角色的.sql中。 对于集成测试,我决定使用HSQLDB隔离数据并执行“安全”测试。为此,我创建了类AbstractIntegrationTest,其中包含从控制器创建和清理表的方法和测试方法。所有测试类都扩展了它:(我隐藏了不涉及数据库

我开发了一个系统,其基础架构层是在Spring boot上开发的(安全性、数据JPA、MVC…)。在运行时,系统连接到MySQL,MySQL的设置位于
src/main/resources/application.properties
以及包含一些用户插入和身份验证角色的.sql中。
对于集成测试,我决定使用HSQLDB隔离数据并执行“安全”测试。为此,我创建了类
AbstractIntegrationTest
,其中包含从控制器创建和清理表的方法和测试方法。所有测试类都扩展了它:(我隐藏了不涉及数据库的方法)

LibraryManagerContextConfiguration
WebSecurityConfig
类包含域和基础结构bean声明,因此它们构成了spring上下文

此类位于
src/test/java
中,数据源.properties文件和test.sql位于
src/test/resources
中。测试类运行得很好,测试脚本运行,表被创建,但是当存储库在测试期间查找某些数据时,它会搜索MySQL而不是HSQLDB。下面是一个测试类:

@RunWith(SpringJUnit4ClassRunner.class)
public class AuthenticationIntegrationTest extends AbstractIntegrationTest {

    @Test
    public void shouldGetAuthorizationJwt() throws Exception {

        final String jsonCredentials = "{"
                    + "\"username\" : \"augusto\","
                    + "\"password\" : \"spring\""
                + "}";

        final MvcResult result =  performRESTLogin(jsonCredentials);
        final MockHttpServletResponse response = result.getResponse();
        final int status = response.getStatus();
        final String jwt = response.getHeader("Authorization");

        assertThat(status, is(200));
        assertThat(jwt, notNullValue());
    }

}
当我使用仅存在于测试数据库中的用户名和密码并获得
403
状态,而MySQL值获得
200
状态时,我验证了这一点。 似乎在准备好HSQLDB之后,会读取main的.properties和.sql,并覆盖正在使用的数据库的设置

应用程序。属性:

server.contextPath=/librarymanager
server.port: 8081

spring.datasource.url = jdbc:mysql://localhost:3306/librarymanager
spring.datasource.username = root
spring.datasource.password = root
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
datasource.class=org.hsqldb.jdbc.JDBCDataSource
datasource.driver=org.hsqldb.jdbc.JDBCDriver
datasource.url=jdbc:hsqldb:mem:librarymanager;sql.syntax_ora=true
datasource.schema=sa
datasource.username=sa
datasource.password=
<!-- Banco de dados -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>test</scope>
        </dependency>
数据源。属性:

server.contextPath=/librarymanager
server.port: 8081

spring.datasource.url = jdbc:mysql://localhost:3306/librarymanager
spring.datasource.username = root
spring.datasource.password = root
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
datasource.class=org.hsqldb.jdbc.JDBCDataSource
datasource.driver=org.hsqldb.jdbc.JDBCDriver
datasource.url=jdbc:hsqldb:mem:librarymanager;sql.syntax_ora=true
datasource.schema=sa
datasource.username=sa
datasource.password=
<!-- Banco de dados -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>test</scope>
        </dependency>
pom.xml中的数据库依赖项:

server.contextPath=/librarymanager
server.port: 8081

spring.datasource.url = jdbc:mysql://localhost:3306/librarymanager
spring.datasource.username = root
spring.datasource.password = root
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
datasource.class=org.hsqldb.jdbc.JDBCDataSource
datasource.driver=org.hsqldb.jdbc.JDBCDriver
datasource.url=jdbc:hsqldb:mem:librarymanager;sql.syntax_ora=true
datasource.schema=sa
datasource.username=sa
datasource.password=
<!-- Banco de dados -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>test</scope>
        </dependency>

mysql

谢谢你的建议。实际使用该框架是最好的选择。

谢谢您的建议。实际上,使用框架是最好的选择。

我认为最好对不同的环境使用不同的属性,以避免这种混淆。application-test.properties,application-prod.properties您正在走向复杂…只需为测试提供一个单独的属性文件,其中包括hsqldb的信息,加载该文件以覆盖其他属性。。。使用框架而不是反对它。此外,您不应该为每个测试重新创建数据库,让您的测试成为事务性的,所有测试都将在测试完成后回滚。为您节省了很多时间。谢谢您的建议。实际上,使用框架是最好的选择。我认为最好对不同的环境使用不同的属性,以避免这种混淆。application-test.properties,application-prod.properties您正在走向复杂…只需为测试提供一个单独的属性文件,其中包括hsqldb的信息,加载该文件以覆盖其他属性。。。使用框架而不是反对它。此外,您不应该为每个测试重新创建数据库,让您的测试成为事务性的,所有测试都将在测试完成后回滚。为您节省了很多时间。谢谢您的建议。实际上,使用框架是最好的选择。