Spring Boot 如何一次性运行@DataJpaTest对真实的数据库,而不是在内存中使用Sping Boot

nkoocmlb  于 2023-06-05  发布在  Spring
关注(0)|答案(4)|浏览(448)

我正在使用Sping Boot 1.4.3,并且有一大堆用@DataJpaTest注解的测试。默认情况下,它们针对内存中的数据库运行。我希望能够运行所有这些对本地MySQL暂时。我怎样才能以一种简单的方式做到这一点?
我发现我可以通过添加@ActiveProfiles("local")来使它工作,其中我有一个指向我的本地MySQL的application-local.properties,但是到处添加它,运行测试然后再次删除它的工作量太大了(因为我只想对MySQL手动运行这个,CI环境将对内存中的数据库运行)。
我使用Maven如果这很重要。
更新:
因此,我有一个application-local.properties,它包含连接到本地MySQL数据库的db属性(我已经使用它来针对本地MySQL运行应用程序)
然后我在IntelliJ中右键单击一个包并选择“Run all tests in package”。在该运行配置的设置中,我将-Dspring.profiles.active=local添加到“VM选项”字段。
我本以为这会在测试期间激活local配置文件,但事实并非如此。如果我停止本地MySQL,测试仍然可以正常运行。

goqiplq2

goqiplq21#

在文档中,它指出您可以在测试类www.example.com上使用@AutoConfigureTestDatabase(replace= Replace.NONE)删除自动配置的h2数据源https://docs.spring.io/spring-boot/docs/1.4.2.RELEASE/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-jpa-test。
此外,您还需要在属性中提供您的数据库设置,以便它不会使用您的应用属性,例如:

# Database
spring.datasource.url=jdbc:mariadb://localhost:3303/test
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true

我把这个放在application.properties的测试包里

kdfy810k

kdfy810k2#

您可以在同一个www.example.com(或.yml)中添加具有MySQL数据源属性的配置文件application.properties:

application.yml

# Existing properties

---
spring:
  profiles: h2
# More h2-related properties

---
spring:
  profiles: postgres
  database:
    driverClassName: org.postgresql.Driver
  datasource:
    url: jdbc:postgresql://localhost:5432/db_dvdrental
    username: user_dvdrental
    password: changeit
  jpa:
    database: POSTGRESQL
    generate-ddl: false
# More postgres-related properties

在集成测试类中使用@ActiveProfiles("postgres"),或者使用VM参数启动容器,如下所示:

java -Dspring.profiles.active=h2 ...
uxhixvfz

uxhixvfz3#

1.将带有JDBC连接的application.yml(properties)添加到src/test/resources中

1.使用@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)运行JPA测试-它禁用嵌入式数据库(h2),否则:
org.springframework.beans.factory.BeanCreationException:创建名为“dataSource”的bean时出错:调用init方法失败;嵌套异常为java.lang.IllegalStateException:无法将DataSource替换为嵌入式数据库进行测试。如果你想要一个嵌入式数据库,请在classpath上放置一个受支持的数据库,或者调整@AutoConfigureTestDatabase的replace属性。

pjngdqdw

pjngdqdw4#

我的问题是,我在项目中有多个application.properties,DataJpaTest收集了所有这些属性,并用生产属性覆盖了我用于测试的属性。
我想到的最好的办法是通过注解类来指示测试使用特定的application.properties

@TestPropertySource(properties = "spring.config.location=classpath:/application.properties")
@DataJpaTest
class MyRepositoryTest {
  // test methods
}

相关问题