【问题标题】:Spring Boot accessing application.properties for JUnit TestSpring Boot 访问 application.properties 以进行 JUnit 测试
【发布时间】:2019-08-23 04:01:29
【问题描述】:

我正在尝试从我的 Spring Boot 应用程序中的 JUnit 访问 application.properties 或 application-test.properties。

我一直在 Stack Overflow 上看到不同的方法来执行此操作,并且只希望使用我的 AppConfig 类(见下文)。

我正在使用 Spring Boot 1.5.6 RELEASE 和 Java 1.8


这是我的应用程序的结构:

MyService
    pom.xml
    src
    ├───main
    │   ├───java
    │   │   └───com
    │   │       └───myservice
    │   │           ├───config
    │   │           │       AppConfig.java
    │   │           └───controller
    │   │           │       UserController.java
    │   │           │ 
    │   │           └─── MyServiceApplication.java    
    │   ├───resources
    │   │      application.properties
    └───test
        ├───java
        │     └───com
        │         └───myservice
        │               └───controller
        │                    UserControllerTest.java
        └───resources
                application-test.properties    

com.myservice.config.AppConfig:

@Configuration
public class AppConfig {

    @Value("${userDir}")
    private String userDir;

    // Getters & setters omitted for brevity
}

main/resources/application.properties:

server.contextPath=/MyService
server.port=8080

# users dir
userDir=/opt/users

test.resources/application-test.properties

# users dir
userDir=/opt/users

我能够在我的主 Spring Boot 应用程序中获取并解析这个目录,但是当我试图从我的 JUnit 测试类 getAllUsers() 测试方法中获取它时,我得到了 NullPointerException:

@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)
@ActiveProfiles("test")
public class UserControllerTest {

    @Autowired
    MockMvc mvc;

    @MockBean
    AppConfig config;

    @MockBean
    UserService userService;

    @Test
    public void getAllUsers() throws Exception {
        User users = new User(config.getUserDir());

        // more lines of code
    }
}

在 Stack Overflow 上,有多种方法可以做到这一点,我将其解读为:

  • JUnit 类可以从 main/resources/application.properties 读取 application.properties。
  • 使用this.class.getClassLoader.getResourceAsStream(...) // 希望使用我的AppConfig.class

问题:

  1. 我可能做错了什么,应该从 application.properties 文件还是从 test-properties.file 读取?

  2. 如何配置 @ActiveProfiles("test"),我应该在 Maven pom.xml 中的某个地方进行设置吗?

  3. 是否需要将 AppConfig 放在 test/java/com/myservice/config 下的源文件夹中?

【问题讨论】:

  • 您的测试类定义了@MockBean AppConfig config;,因此它使用模拟 AppConfig 而不是加载应用程序属性的真实 AppConfig。
  • 请不要以某种方式要求人们投票或不投票。它没有帮助,如果你提请注意不应该投票的事情,人们可能会更仔细地观察并无论如何都会这样做。无论如何,我们希望这里的投票是有机的。
  • 您找到解决方案了吗?

标签: java spring maven spring-boot junit


【解决方案1】:

您可以在测试类中使用@TestPropertySource 注解。

只是注释 @TestPropertySource("classpath:config/testing.properties") 在您的 测试类。

您应该能够读取属性,例如使用 @Value 注解。

@Value("${fromTest}")
private String fromTest;

你的配置像这样src/main/resources/config/testing.properties

【讨论】:

    【解决方案2】:

    将以下注释添加到您的测试类:

    @TestPropertySource(locations="classpath:application-test.properties")
    

    这应该让你工作:) 请注意你必须导入它:

     import org.springframework.test.context.TestPropertySource;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 2021-12-17
      • 2021-01-24
      • 1970-01-01
      • 2019-08-17
      • 2018-05-25
      • 2019-10-26
      相关资源
      最近更新 更多