'application.yml'中的Spring Boot属性未从JUnit Test加载

ali*_*opi 35 java junit spring spring-test spring-boot

我究竟做错了什么?我正在使用这个小的独立应用程序运行并找到我的src/main/resources/config/application.yml.相同的配置在JUnit中不起作用,见下文:

@Configuration
@ComponentScan
@EnableConfigurationProperties

public class TestApplication {

    public static void main(String[] args) {

        SpringApplication.run(TestApplication.class);
    }
}


@Component
@ConfigurationProperties

public class Bean{
    ...
}
Run Code Online (Sandbox Code Playgroud)

以下不起作用,application.yml未加载相同的属性并且Bean只有null值:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestApplication.class)

public class SomeTestClass {
    ...
}
Run Code Online (Sandbox Code Playgroud)

lub*_*nac 36

试试这个:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestApplication.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
public class SomeTestClass {
    ...
}
Run Code Online (Sandbox Code Playgroud)

编辑:

对于Spring Boot版本1.5+,SpringApplicationConfiguration被删除以支持SpringBootTest或直接使用SpringBootContextLoader.

您仍然可以使用initializersContextConfiguration注释的参数.


Yar*_*rix 9

使用在SpringBoot 2.0中加载任何自定义yml文件的技巧@SpringBootTest

  • 在test\resources中创建一些yml文件
  • 使用ConfigFileApplicationContextInitializerspring.config.location财产

示例代码:

@RunWith(SpringRunner.class)
@ContextConfiguration(
    classes = { MyConfiguration.class, AnotherDependancy.class },
    initializers = {ConfigFileApplicationContextInitializer.class} )
@TestPropertySource(properties = { "spring.config.location=classpath:myApp-test.yml" })
public class ConfigProviderTest {
    @Autowired
    private MyConfiguration myConfiguration; //this will be filled with myApp-test.yml 

   @Value("${my.config-yml-string}")
   private String someSrting; //will get value from the yml file.

}
Run Code Online (Sandbox Code Playgroud)

  • 但你必须要小心一些事情......因为你使用的是“@ContextConfiguration”,所以测试实际上会有一个上下文。因此,下一个测试类将具有相同的上下文,因为 Spring 在测试之间重用它,并且当同时执行时,您的测试类可能会因副作用而失败。为了避免这种行为,您还必须使用“@DirtiesContext”和“@ContextConfiguration”。 (4认同)

Dex*_*spi 9

添加到利亚姆答案,另一种选择是:

@TestPropertySource(locations = { "classpath:application.yaml" })
Run Code Online (Sandbox Code Playgroud)

application.yaml这里的主要区别是,如果不在您的/test/resources目录中,测试将失败并出现文件未找到异常


小智 8

这是另一种方式:[Spring Boot v1.4.x]

@Configuration
@ConfigurationProperties(prefix = "own")
public class OwnSettings {

    private String name;
    Getter & setters...

}
Run Code Online (Sandbox Code Playgroud)
import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@BootstrapWith(SpringBootTestContextBootstrapper.class)
public class OwnSettingsTest {

  @Autowired
  private OwnSettings bean;

  @Test
  public void test() {
    bean.getName();
  }
}
Run Code Online (Sandbox Code Playgroud)

仅当"application.properties"文件存在时,此方法才有效.

例如maven项目:

src/main/resources/application.properties [ 该文件可以为空但它是必需的!]
src/main/resources/application.yml [这是你的真实配置文件]


ali*_*opi 8

2017年2月替代方案:

@SpringBootTest
@ContextConfiguration(classes = { TestApplication.class })
@RunWith(SpringRunner.class)
public class SomeTestClass {
   ...
}
Run Code Online (Sandbox Code Playgroud)

精益变体(没有@SpringBootTest):

@ContextConfiguration(classes = { TestApplication.class },
                 initializers = { ConfigFileApplicationContextInitializer.class })
@RunWith(SpringRunner.class)
public class SomeTestClass {
Run Code Online (Sandbox Code Playgroud)

  • 但是@SpringBootTest 不会引导您进行单元测试,而是进行更多的集成测试。 (2认同)
  • `initializers = { ConfigFileApplicationContextInitializer.class }` 正是我要找的!谢谢。 (2认同)

Lin*_*adu 7

由于 spring-boot 2.6.0 版本org.springframework.boot.test.context.ConfigFileApplicationContextInitializer已被弃用,建议使用org.springframework.boot.test.context.ConfigDataApplicationContextInitializer

在您的测试中,您可以将其用作:

@ContextConfiguration(classes = {
  ...        
}, initializers = ConfigDataApplicationContextInitializer.class)
public class MyTestingClassIT
Run Code Online (Sandbox Code Playgroud)


Lia*_*iam 6

使用 Spring Boot 2 进行单元测试

spring boot 2 默认支持“application.properties”,对于“application.yml”,只需在下面添加:

@TestPropertySource(properties = { "spring.config.location=classpath:application.yml" })
Run Code Online (Sandbox Code Playgroud)

例如

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = { "spring.config.location=classpath:application.yml" })
public class ServiceTest {...}
Run Code Online (Sandbox Code Playgroud)