@SpringBootTest是一个注解,用于测试Spring Boot应用程序。它可用于指示Spring Boot测试应用程序的启动点,并为测试提供一个可用的Spring应用程序上下文。它还提供了自动配置的功能,可以将依赖注入到测试类中。
properties临时属性测试注入
测试过程本身并不是一个复杂的过程,但是很多情况下测试时需要模拟一些线上情况,或者模拟一些特殊情况。如果当前环境按照线上环境已经设定好了,例如是下面的配置
servers: ip-address: 192.168.0.1 port: 2345 dataSize: 8
但是你现在想测试对应的兼容性,需要测试如下配置
servers: ip-address: 192.168.0.1 port: 2345 dataSize: 4
这个时候我们能不能每次测试的时候都去修改源码application.yml中的配置进行测试呢?显然是不行的。每次测试前改过来,每次测试后改回去,这太麻烦了。我们需要在测试环境中创建一组临时属性,去覆盖我们源码中(application.yml中)设定的属性。
这个时候就可以使用注解@SpringBootTest添加属性来模拟临时属性
//properties属性可以为当前测试用例添加临时的属性配置 @SpringBootTest(properties = {"servers.dataSiz=4"}) public class PropertiesAndArgsTest { @Value("${servers.dataSiz}") private String dataSiz; @Test void testProperties(){ System.out.println(dataSiz); } }
args临时参数测试注入
启动springboot程序时,通过命令行参数也可以设置属性值。测试时也可以进行修改属性
//args属性可以为当前测试用例添加临时的命令行参数 @SpringBootTest(args={"--test.prop=testValue2"}) public class PropertiesAndArgsTest { @Value("${test.prop}") private String msg; @Test void testProperties(){ System.out.println(msg); } }
args属性配置优先于properties属性配置加载。
五种配置的优先级的先后顺序为
- 1 命令行参数 (格式:–key=value)
- 2 Java系统属性配置 (格式: -Dkey=value)
- 3 application.properties
- 4 application.yml
- 5 application.yaml
bean配置类属性注入(@Import)
一个spring环境中可以设置若干个配置文件或配置类,若干个配置信息可以同时生效。 需求就是在测试环境中再添加一个配置类,然后启动测试环境时,生效此配置就行了。
Import注解在具体的测试中导入临时的配置,例如测试用例,方便测试过程,且上述配置不影响其他的测试类环境
步骤①:在测试包test中创建专用的测试环境配置类(不要道java目录添加,那样子对源码进行了修改了)
@Configuration public class MsgConfig { @Bean public String msg(){ return "bean msg"; } }
步骤②:在启动测试环境时,导入测试环境专用的配置类,使用@Import注解即可实现
@SpringBootTest @Import({MsgConfig.class}) public class ConfigurationTest { @Autowired private String msg; @Test void testConfiguration(){ System.out.println(msg); } }
@Import注解在具体的测试中导入临时的配置,例如测试用例,方便测试过程,且上述配置不影响其他的测试类环境
@Import注解提供了三种用法
1、@Import一个普通类 spring会将该类加载到spring容器中
2、@Import一个类,该类实现了ImportBeanDefinitionRegistrar接口,在重写的registerBeanDefinitions方法里面,能拿到BeanDefinitionRegistry bd的注册器,能手工往beanDefinitionMap中注册 beanDefinition
3、@Import一个类 该类实现了ImportSelector 重写selectImports方法该方法返回了String[]数组的对象,数组里面的类都会注入到spring容器当中