Spring Boot Test:@TestPropertySource不会覆盖@EnableAutoConfiguration

时间:2018-04-11 17:44:44

标签: java spring spring-boot spring-ldap

我正在使用Spring Data LDAP从LDAP服务器获取用户数据。

我的文件结构如下:

main
  java
    com.test.ldap
      Application.java
      Person.java
      PersonRepository.java
  resources
    application.yml
    schema.ldif

test
  java
    Tests.java
  resources
    test.yml
    test_schema.ldif

这是我的测试课:

import com.test.ldap.Person;
import com.test.ldap.PersonRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {PersonRepository.class})
@TestPropertySource(locations = "classpath:test.yml")
@EnableAutoConfiguration
public class Tests {

    @Autowired
    private PersonRepository personRepository;

    @Test
    public void testGetPersonByLastName() {
        List<Person> names = personRepository.getPersonNamesByLastName("Bachman");
        assert(names.size() > 0);
    }

}

问题是,Spring Boot正在加载application.ymlschema.ldif文件而不是我的测试YAML和LDIF文件,尽管我的@TestPropertySource注释明确列出了{{1 }}。这似乎是由于自动配置,我更喜欢使用它。

我希望test.yml比自动配置具有更高的优先级,但似乎并非如此。这是春天的错误,还是我误解了什么?

对于记录,这是我的@TestPropertySource文件(它确实指定了test.yml):

test_schema.ldif

2 个答案:

答案 0 :(得分:2)

我发现YML文件不能与 @TestPropertySource 注释一起使用。 解决此问题的一种干净方法是使用 @ActiveProfile 。假设具有测试属性的YML文件称为

application-integration-test.yml

那么您应该使用这样的注释

@ActiveProfile("integration-test")

答案 1 :(得分:1)

所以我能够通过手动指定使用LDIF文件所需的属性来解决这个问题。这是因为,根据@TestPropertySource文档,内联属性具有比属性文件更高的首选项。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {PersonRepository.class})
@TestPropertySource(properties = 
{"spring.ldap.embedded.ldif=test_schema.ldif", "spring.ldap.embedded.base-dn=dc=test,dc=com"})
@EnableAutoConfiguration
public class Tests {
    //...
}

然而,这不是最好的解决方法:如果我需要定义的不仅仅是两个属性,该怎么办?将它们全部列在那里是不切实际的。

修改

将我的test.yml文件重命名为application.yml,这样它就会覆盖生产文件。事实证明,TestPropertySource注释仅适用于.properties文件。