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

2022-08-31 14:58:50

我做错了什么?我正在使用这个小的独立应用程序,它运行并找到我的.相同的配置不适用于 JUnit,请参阅下文:src/main/resources/config/application.yml

@Configuration
@ComponentScan
@EnableConfigurationProperties

public class TestApplication {

    public static void main(String[] args) {

        SpringApplication.run(TestApplication.class);
    }
}


@Component
@ConfigurationProperties

public class Bean{
    ...
}

以下不起作用,不会加载 相同的属性,并且只有值:application.ymlBeannull

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

public class SomeTestClass {
    ...
}

答案 1

试试这个:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestApplication.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
public class SomeTestClass {
    ...
}

编辑

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

您仍然可以将参数与注释一起使用。initializersContextConfiguration


答案 2

在 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.

}

对于 JUnit 5,请使用注释而不是@ExtendWith(SpringExtension.class)@RunWith(SpringRunner.class)


推荐