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

时间:2019-04-01 22:24:24

标签: java spring maven spring-boot junit

我正在尝试从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
    }
}

在堆栈溢出中,有多种方式可以做到这一点,我读为:

  • 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下的源文件夹中?

2 个答案:

答案 0 :(得分:0)

在测试类中添加以下注释:

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

这应该可以使您工作:)请注意,您必须将其导入:

 import org.springframework.test.context.TestPropertySource;

答案 1 :(得分:0)

  

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

     

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

     

例如,您应该可以使用   @Value注释。

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

您的配置src/main/resources/config/testing.properties