Java 用于spring boot应用程序中集成测试的内存中数据库配置(HSQLDB)
我开发了一个系统,其基础架构层是在Spring boot上开发的(安全性、数据JPA、MVC…)。在运行时,系统连接到MySQL,MySQL的设置位于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,其中包含从控制器创建和清理表的方法和测试方法。所有测试类都扩展了它:(我隐藏了不涉及数据库
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的信息,加载该文件以覆盖其他属性。。。使用框架而不是反对它。此外,您不应该为每个测试重新创建数据库,让您的测试成为事务性的,所有测试都将在测试完成后回滚。为您节省了很多时间。谢谢您的建议。实际上,使用框架是最好的选择。