Spring Boot 访问 application.properties 进行 JUnit 测试

Pac*_*ver 7 java junit spring maven spring-boot

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

\n\n

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

\n\n

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

\n\n
\n\n

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

\n\n
MyService\n    pom.xml\n    src\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80main\n    \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80java\n    \xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80com\n    \xe2\x94\x82   \xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80myservice\n    \xe2\x94\x82   \xe2\x94\x82           \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80config\n    \xe2\x94\x82   \xe2\x94\x82           \xe2\x94\x82       AppConfig.java\n    \xe2\x94\x82   \xe2\x94\x82           \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80controller\n    \xe2\x94\x82   \xe2\x94\x82           \xe2\x94\x82       UserController.java\n    \xe2\x94\x82   \xe2\x94\x82           \xe2\x94\x82 \n    \xe2\x94\x82   \xe2\x94\x82           \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 MyServiceApplication.java    \n    \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80resources\n    \xe2\x94\x82   \xe2\x94\x82      application.properties\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80test\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80java\n        \xe2\x94\x82     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80com\n        \xe2\x94\x82         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80myservice\n        \xe2\x94\x82               \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80controller\n        \xe2\x94\x82                    UserControllerTest.java\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80resources\n                application-test.properties    \n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

com.myservice.config.AppConfig:

\n\n
@Configuration\npublic class AppConfig {\n\n    @Value("${userDir}")\n    private String userDir;\n\n    // Getters & setters omitted for brevity\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

主/资源/application.properties:

\n\n
server.contextPath=/MyService\nserver.port=8080\n\n# users dir\nuserDir=/opt/users\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试.资源/应用程序测试.属性

\n\n
# users dir\nuserDir=/opt/users\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
@RunWith(SpringRunner.class)\n@WebMvcTest(UserController.class)\n@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)\n@ActiveProfiles("test")\npublic class UserControllerTest {\n\n    @Autowired\n    MockMvc mvc;\n\n    @MockBean\n    AppConfig config;\n\n    @MockBean\n    UserService userService;\n\n    @Test\n    public void getAllUsers() throws Exception {\n        User users = new User(config.getUserDir());\n\n        // more lines of code\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

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

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

问题):

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

  2. \n
  3. 如何配置 @ActiveProfiles("test"),我应该在 Maven pom.xml 中的某处设置它吗?

  4. \n
  5. 我是否需要将 AppConfig 放在 test/java/com/myservice/config 下的源文件夹中?

  6. \n
\n

Has*_*son 0

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

@TestPropertySource(locations="classpath:application-test.properties")
Run Code Online (Sandbox Code Playgroud)

这应该可以帮助您工作:)请注意,您必须导入它:

 import org.springframework.test.context.TestPropertySource;
Run Code Online (Sandbox Code Playgroud)