springboot 测试_Spring、Spring Boot 和 TestNG 测试指南 ( 3 )

Spring&Spring Boot Testing工具提供了一些方便测试的Annotation,本文会对其中的一些做一些讲解。

@TestPropertySource

@TestPropertySource可以用来覆盖掉来自于系统环境变量,Java的系统属性,@PropertySource的属性。

同时@TestPropertySource(properties=…)优先级高于@TestPropertySource(locations=…)。

利用它我们可以很方便的在测试代码里微调,模拟配置(比如修改操作系统目录分隔符,数据源等)。

例子1:使用Spring Testing工具

我们先使用@PropertySource将一个外部属性文件加载进来,PropertySourceConfig:

@Configuration@PropertySource(“ classpath:me / chanjar / annotation / testps / ex1 / property-source.properties ”)public class PropertySourceConfig {}

file: property-source.properties

foo=abc

然后我们用@TestPropertySource覆盖了这个特性:

TestPropertySource(properties = { “ foo = xyz ” ...

最后我们测试了是否覆盖成功(结果是成功的):

843a496e78dfc7901be3335e86f70495.png

同时我们还对@TestPropertySource做了一些其他的测试,具体情况你可以自己观察。为了方便你观察@TestPropertySource对系统环境变量和Java的系统属性的覆盖效果,我们在一开始打印出了它们的值。

2e516fe1fcb11150b9254fab11b43111.png

例子2:使用Spring Boot Testing工具

@TestPropertySource也可以和@SpringBootTest一起使用。

4ad3476b1abcfe7bc4cd508527b83f55.png

@ActiveProfiles

@ActiveProfiles可以用来在测试的时候启用某些资料的豆本章节的测试代码使用了下面的这个配置:

fe8a53f1714dae15ac76a88323076a15.png

例子1:不使用ActiveProfiles

在没有@ActiveProfiles的时候,外形=默认和没有设定个人资料的豆会被加载到。

源代码ActiveProfileTest:

6580b83f265c38e745aa1baabdd530a5.png

例子二:使用ActiveProfiles

当使用了@ActiveProfiles的时候,轮廓匹配的和没有设定个人资料的豆会被加载到。

c4d3f4c1009015e852a8dc2c5d04140e.png

总结

在没有@ActiveProfiles的时候,外形=默认和没有设定个人资料的豆会被加载到。

当使用了@ActiveProfiles的时候,轮廓匹配的和没有设定个人资料的豆会被加载到。

@ActiveProfiles同样也可以和@SpringBootTest配合使用,这里就不举例说明了。

Annotations - @JsonTest

@JsonTest是Spring Boot提供的方便测试JSON序列化反序列化的测试工具,在Spring Boot的文档中有一些介绍。

需要注意的是@JsonTest需要Jackson的ObjectMapper,事实上如果你的Spring Boot项目添加了spring-web的Maven依赖,JacksonAutoConfiguration就会自动为你配置一个:

ea9e13740a83325746372b861acf5139.png

例子1:简单例子

b2bb46a1e701a6b46f5e8ad2ccce3759.png

例子2: 测试@JsonComponent

@JsonTest可以用来测试@JsonComponent。

这个例子里使用了自定义的@JsonComponent FooJsonComponent:

2a13dd7623b3d8164bc3108cfa92ee0f.png
9c430c478594c442b3f89629f0202110.png

例子3: 使用@ContextConfiguration

事实上@JsonTest也可以配合@ContextConfiguration一起使用。

30b85037f55b5481ae56005cf6331af7.png

@OverrideAutoConfiguration

在 Spring、Spring Boot 和 TestNG 测试指南 ( 1 ) 提到:

除了单元测试(不需要初始化ApplicationContext的测试)外,尽量将测试配置和生产配置保持一致。比如如果生产配置里启用了AutoConfiguration,那么测试配置也应该启用。因为只有这样才能够在测试环境下发现生产环境的问题,也避免出现一些因为配置不同导致的奇怪问题。

那么当我们想在测试代码里关闭Auto Configuration如何处理?

方法1:提供另一套测试配置

方法2:使用@OverrideAutoConfiguration

方法1虽然能够很好的解决问题,但是比较麻烦。而方法2则能够不改变原有配置、不提供新的配置的情况下,就能够关闭Auto Configuration。

在本章节的例子里,我们自己做了一个Auto Configuration类,AutoConfigurationEnableLogger:

a14005ec611e5540fbee38ea221a9634.png

并且在META-INF/spring.factories里注册了它:

72eaa0ddf7e0e3239df3c3a269c64471.png

这样一来,只要Spring Boot启动了Auto Configuration就会打印出日志:

2017-08-24 16:44:52.789 INFO 13212 --- [ main] m.c.a.o.AutoConfigurationEnableLogger : Auto Configuration Enabled

例子1:未关闭Auto Configuration

f6aaf2c496640c8cbadc2345d982a3ef.png

查看输出的日志,会发现Auto Configuration已经启用。

例子2:关闭Auto Configuration

然后我们用@OverrideAutoConfiguration关闭了Auto Configuration。

12902e05d67509e07a193dedb7ccebd4.png

再查看输出的日志,就会发现Auto Configuration已经关闭。

@TestConfiguration

@TestConfiguration是Spring Boot Test提供的一种工具,用它我们可以在一般的@Configuration之外补充测试专门用的Bean或者自定义的配置。

@TestConfiguration实际上是一种@TestComponent,@TestComponent是另一种@Component,在语义上用来指定某个Bean是专门用于测试的。

需要特别注意,你应该使用一切办法避免在生产代码中自动扫描到@TestComponent。 如果你使用@SpringBootApplication启动测试或者生产代码,@TestComponent会自动被排除掉,如果不是则需要像@SpringBootApplication一样添加TypeExcludeFilter:

6583f4aa81c00a6ea1e3f7b4e7250138.png

例子1:作为内部类

@TestConfiguration和@Configuration不同,它不会阻止@SpringBootTest去查找机制(在Chapter 1: 基本用法 – 使用Spring Boot Testing工具 – 例子4提到过),正如@TestConfiguration的javadoc所说,它只是对既有配置的一个补充。

所以我们在测试代码上添加@SpringBootConfiguration,用@SpringBootTest(classes=…)或者在同package里添加@SpringBootConfiguration类都是可以的。

而且@TestConfiguration作为内部类的时候它是会被@SpringBootTest扫描掉的,这点和@Configuration一样。

c47d1dd8b2a5d452590d6d23e394c0dc.png

例子2:对@Configuration的补充和覆盖

@TestConfiguration能够:

  1. 补充额外的Bean
  2. 覆盖已存在的Bean

要特别注意第二点,@TestConfiguration能够直接覆盖已存在的Bean,这一点正常的@Configuration是做不到的。

我们先提供了一个正常的@Configuration(Config):

c3a1ce88c9f41546c092ac4ea829dd0b.png

又提供了一个@TestConfiguration,在里面覆盖了foo Bean,并且提供了foo2 Bean(TestConfig):

a8320e72d3d9c6fcaab72f74cd05f8ca.png
6e68ee22e50fbe181d1d2078de1ffd30.png

再查看输出的日志,就会发现Auto Configuration已经关闭。

例子3:避免@TestConfiguration被扫描到

在上面的这个例子里的TestConfig是会被@ComponentScan扫描到的,如果要避免被扫描到,在本文开头已经提到过了。

先来看一下没有做任何过滤的情形,我们先提供了一个@SpringBootConfiguration(IncludeConfig):

d161bf623ae74e471c468910961284c1.png

然后有个测试代码引用了它(TestConfigIncludedTest):

8677159e9503262ecfaa06059c66a638.png

从这段代码可以看到TestConfig被加载了。

现在我们使用TypeExcludeFilter来过滤@TestConfiguration(ExcludeConfig1):

65f7b3373098b062b19e946a9e320ffe.png

再来看看结果(TestConfigExclude_1_Test):

07456dd4083c9d11295480ef56416daf.png

还可以用@SpringBootApplication来排除TestConfig(ExcludeConfig2):

d628a2ba839153e55fc9a490f042e69d.png

看看结果(TestConfigExclude_2_Test):

045c0501e79ce2fa861e9962c8077336.png
e1cef8c662a247acf8f29efbc7298d55.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值