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

具有测试应用程序.属性的Junit 5

张可人
2023-03-14

我正在学习JUnit5和测试用例。我使用的是spring boot version'2.2.6.Release和JUnit5,在我的应用程序中,我有一个基于属性文件中的布尔标志进行处理的方法

\src\main\resources\application.properties

#data base connection properties
spring.app.datasource.url=jdbc:mysql://localhost:3306/student_db
spring.app.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.app.datasource.username=root
spring.datasource.password=root
spring.app.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

#additional properties
spring.property.name=shrikant
spring.property.enable=false

数据库连接属性用于创建数据库连接

@Value("${spring.app.datasource.url}")
private String url;
@Value("${spring.app.datasource.driver-class-name}")
private String className;
@Value("${spring.app.datasource.username}")
private String userName;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.app.jpa.properties.hibernate.dialect}")
private String dialect;
@RestController
public class Controller {
    @Value("${spring.property.name}")
    private String name;
    @Value("${spring.property.enable}")
    private boolean status;

    public void validateObject(String surName) {
        if (status) {                              # if this flag is true then only process
            System.out.println("name= " + name);
            System.out.println("surName= " + surName);
        }
    }

ControllerTest.java

@SpringBootTest
class ControllerTest {
    @Autowired
    private Controller controller;
    @Test
    void show() {
        controller.validateObject("sharma");
    }

默认情况下,该标志为false,因此每次测试用例运行时,它都不会处理该对象。所以我尝试在测试文件夹中创建aplication.properties

\src\test\resources\application.properties

spring.property.name=vishal
spring.property.enable=true

但现在它给了我一个错误

Could not resolve placeholder 'spring.app.datasource.url'

但我不想提供DB连接URL,我不是在测试时连接到数据库。

如何仅为测试用例更改属性文件的值。

更新:-我发现

@SpringBootTest
@TestPropertySource(properties = {"spring.property.name=vishal", " spring.property.status=true"})
class ControllerTest {

将暂时解决问题,通过提供键和值,但我有很多键,不能以这样的方式提供。

共有1个答案

欧阳勇
2023-03-14

如果您使用@springboottest,那么您的测试将加载整个Spring上下文。这意味着它将创建所有bean并尝试将它们连接在一起。如果您将属性值注入到bean中,则必须为此类测试指定所有属性值,否则将无法启动应用程序。

在这种情况下,可以使用@webmvctest@datajpatest这样的测试注释来集中测试应用程序的各个部分。使用@webmvctest,您将获得一个应用程序上下文,其中只包含控制器和与您的web层相关的所有内容。其他bean(如服务类)可以使用@mockedbean进行嘲弄。

接下来,为了测试服务类中的业务逻辑,尽量不要使用@springboottest,而是使用普通的JUnit5和Mockito来验证代码。

您可能仍然希望使用@springboottest进行一些集成测试,以确保所有内容都在一起工作。在这种情况下,您可以在src/test/resources/中对application.properties中的任何静态属性进行硬编码,或者使用您已经做过的注释:@TestPropertySource(properties={“spring.property.name=Vishal”,“spring.property.status=true”})

当涉及到提供数据库时,您可以配置嵌入式数据库(我会尽量避免),也可以使用与生产中相同的数据库。Testcontainers在为测试提供外部基础设施(如数据库)方面帮助很大。

使用Spring Boot>=2.2.6和JUnit的示例设置如下所示:

@Testcontainers
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class ApplicationIT {
 
  @Container
  public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer()
    .withPassword("password")
    .withUsername("username");
 
  @DynamicPropertySource
  static void postgresqlProperties(DynamicPropertyRegistry registry) {
    registry.add("spring.datasource.url", postgreSQLContainer::getJdbcUrl);
    registry.add("spring.datasource.password", postgreSQLContainer::getPassword);
    registry.add("spring.datasource.username", postgreSQLContainer::getUsername);
  }
 
  @Test
  public void contextLoads() {
  }
 
}
 类似资料:
  • 我正在学习Spring boot application,并且有使用xml和java配置的Spring应用程序的经验。 我使用的应用程序具有包含UI、服务和DAO的代码基体系结构。所有这些组件都有单独的上下文文件,即。web-applicationcontext.xml或application-servlet-context.xml、service-context.xml和data-context

  • 假设我有以下SoapApplication启动程序: 那么application.properties中的一些属性在哪里 我更喜欢设置test.properties 我试着做了这样的东西: 和SpringApplication.Run(testconfig.class,args); System.SetProperty(“spring.config.location”,“file:testdata

  • 我有一个测试: 这是控制器(测试类)中的相关部分: 我有一个在下,我需要覆盖它,仅针对名为 也许我可以使用另一个文件“application.properties”和另一个类测试,但我正在寻找一个更智能的解决方案。

  • 我在下有一个测试属性文件。但是我无法在我的单元测试中获取要加载的值。我有以下类: 在生产代码中,加载来自src/main/resources/application的值。yml。 单元测试等级: 我试图为每个应用程序添加一个测试配置文件。yml文件,看看添加ActiveProfiles(“test”)是否有效,但没有。 src/main/resources/application。yml公司 我还

  • 先决条件 Apache Tomcat 7 Spring 4.1.5。发布 Spring靴1.2.2。发布 Apache Camel 2.15.1 问题 我将Spring Boot与Endpoint Setup也使用的配置类一起使用。 在生产环境中,默认情况下,属性将从conf/application.properties读取。 我想通过CamelSpringTestSupport测试我的路线 因此

  • 我做错了什么?我正在使用这个小型独立应用程序,它运行并查找我的。相同的配置在JUnit中不起作用,请参阅下面: 以下不起作用,中的相同属性未加载并且只有值: