github.com/chanjarster/spring-test-examples
Spring&Spring Boot测试工具提供了一些便于测试的注释,本文将解释其中的一些。
@TestPropertySource
@TestPropertySource可用于覆盖系统环境变量、Java系统属性和@PropertySource属性。
同时,@ test property source(properties =…)比@ test property source(locations =…)具有更高的优先级。
使用它,我们可以很容易地在测试代码中对配置进行微调和模拟(比如修改操作系统目录分隔符、数据源等)。).
示例1:使用弹簧测试工具
我们首先使用@PropertySource加载一个外部属性文件,PropertySourceConfig:
@配置
@ PrOperty SOURce(" class path:me/chan jar/annotation/testps/ex1/property-SOURce . properties ")
公共类PropertySourceConfig {
}
文件:property-source.properties
foo=abc
然后我们用@TestPropertySource覆盖了这个特性:
TestPropertySource(properties = { " foo = XYZ "...
最后,我们测试了覆盖是否成功(结果是成功的):
@测试
public void TestOverridePropertySource(){
AssertEquals(环境。“XYZ”。
}
同时我们在@TestPropertySource上做了一些其他的测试,具体情况你可以自己观察。为了方便大家观察@TestPropertySource对系统环境变量和Java系统属性的覆盖效果,我们在开始就打印出了它们的值。
源代码测试属性测试:
@ Context configuration(class = PropertySourceConfig。类)
@TestPropertySource(
attribute = {“rich = XYZ”,“ba = UVW”,“PATH = AAA”,“Java . runtime . name = BBB”},
location = " class path:I/chanjar/annotation/testps/ex1/test-property-source . properties "
)
公共类TestPropertyTest扩展了abstracttestingspringcontexttests来实现EnvironmentAware {
私人环境环境;
@覆盖
无效的公共设置环境{
这个。环境=环境;
地图<。字符串,对象>;系统环境=((可配置环境)环境)。getSystemEnvironment();
系统。出去。Println ("= = =系统环境= = ";
系统。出去。Println of (getmapstring(系统环境));
系统。出去。println()of;
系统。出去。Println ("= = = Java系统属性= = ";
地图<。字符串,对象>;系统属性=((可配置环境)环境)。getSystemProperties();
系统。出去。Println of (getmapstring(系统属性));
}
@测试
public void TestOverridePropertySource(){
AssertEquals(环境。“XYZ”。
}
@测试
public void testOverrideSystemEnvironment(){
AssertEquals(环境。Getproperty ("path ")," AAA ");
}
@测试
public void testOverrideJavaSystemProperties(){
AssertEquals(环境。getproperty of(" Java . runtime . name ")," BBB ");
}
@测试
public void testinlinetestpropertyroverrideresourcelocationtestproperty(){
AssertEquals(环境。“文章”,UVW。
}
私有字符串获取映射字符串(映射& lt字符串,对象>;地图){
返回字符串.加(" n ",
地图。密钥集().stream().Map (k->: +"="+map。Get (k))。收集(toList())
);
}
}
示例2:使用弹簧启动测试工具
@TestPropertySource也可以与@ RibbootTest一起使用。
有关源代码,请参见测试属性测试:
@回弹测试(class = PropertySourceConfig。类)
@TestPropertySource(
attribute = {“rich = XYZ”,“ba = UVW”,“PATH = AAA”,“Java . runtime . name = BBB”},
location = " class path:I/chanjar/annotation/testps/ex1/test-property-source . properties "
)
公共类TestPropertyTest扩展了abstracttestingspringcontexttests来实现EnvironmentAware {
// ..
@活动配置文件
@ActiveProfiles可用于在测试期间启用一些数据beans。本章中的测试代码使用以下配置:
@配置
公共类Config {
@豆
@个人资料(“开发”)
public Foo fooDev(){
返回新Foo(“开发”);
}
@豆
@简介(“产品”)
public Foo fooProduct(){
退回新Foo(“产品”);
}
@豆
@配置文件(“默认”)
public Foo fooDefault(){
返回新的Foo(“默认”);
}
@豆
public bar bar(){
返回新栏(“无简介”);
}
}
示例1:不要使用活动配置文件
当没有@ActiveProfiles时,shape = default且没有配置文件的beans将被加载到。
源代码活动配置文件测试:
@ Context configuration(class = configuration。类)
公共类ActiveProfileTest扩展了abstracttestngspringcontexttests {
@自动连线
二等兵Foo foo
@自动连线
私人酒吧;
@测试
public void test(){
assertequils(FOO)。GetName () of," default ");
assertequils(ba。GetName () of," no profile ");
}
}
示例2:使用活动配置文件
当使用@ActiveProfiles时,具有配置文件匹配且没有配置文件的beans将被加载到。
源代码活动配置文件测试:
@ Context configuration(class = configuration。类)
[@活动配置文件][文档-活动-配置文件](“产品”)
公共类ActiveProfileTest扩展了抽象测试pringContextTests {
@自动连线
二等兵Foo foo
@自动连线
私人酒吧;
@测试
public void test(){
assertequils(FOO)。GetName()," product ");
assertequils(ba。GetName () of," no profile ");
}
}
摘要
当没有@ActiveProfiles时,shape = default且没有配置文件的beans将被加载到。
当使用@ActiveProfiles时,具有配置文件匹配且没有配置文件的beans将被加载到。
@ActiveProfiles也可以与@回弹测试结合使用,这里不做说明。
@JsonTest
@JsonTest是Spring Boot提供的方便的测试JSON序列化和反序列化的测试工具,Spring Boot的文档中有介绍。
需要注意的是@JsonTest需要杰克逊的ObjectMapper。事实上,如果您的Spring Boot项目添加了spring-web的Maven依赖项,JacksonAutoConfiguration会自动为您配置一个:
& lt依赖性>。
& ltgroupId>。org . spring framework . boot & lt;/groupId>。
& ltartifactId>。spring-boot-autoconfigure<。/artifactId >
& lt/dependency>。
& lt依赖性>。
& ltgroupId>。org.springframework & lt/groupId>。
& ltartifactId>。spring-web<。/artifactId >
& lt/dependency>。
这里没有日期和时间的例子,但这很复杂。请参考我的另一篇文章:Spring Boot Jackson处理日期和时间类型的例子。
https://github . com/chanjarster/springoot-Jackson-datetime-示例
例子1:简单的例子
源代码见SimpleJsonTest:
@回弹测试(classes = SimpleJsonTest.class)
@JsonTest
公共类SimpleJsonTest扩展了抽象测试pringContextTests {
@自动连线
私人杰克逊公司<。Foo>。json
@测试
public void testSerialize()引发异常{
Foo details = new Foo(“本田”,12);
//使用交钥匙下的json文件测试结果是否正确
assert ThAT(this . JSON . write(details))。isEqualToJson("应为. JSON ");
//或者使用JSON基于路径的验证
assert ThAT(this . JSON . write(details))。hasJsonPathStringValue(@)。名称");
assert ThAT(this . JSON . write(details))。extracting jsonpathstringvalue(@)。名称”)。isEqualTo("本田");
assert ThAT(this . JSON . write(details))。hasjsonPathNumberVaLue(@)。年龄");
assert ThAT(this . JSON . write(details))。extracting JSonPathNumberVaLue(@)。年龄”)。isEqualTo(12);
}
@测试
public void testDeserialize()引发异常{
String content = "{"name":"Ford "," age ":13 } ";
foo actual = this . JSON . ParseObject(content);
assertThat(实际)。isEqualTo(new Foo("Ford ",13));
assertThat(actual.getName())。isEqualTo("福特");
assertThat(actual.getAge())。isEqualTo(13);
}
}
示例2: test @JsonComponent
@JsonTest可以用来测试@JsonComponent。
在本例中,使用了用户定义的@JsonComponent FooJsonComponent:
@JsonComponent
public class FooJsonComponent {
公共静态类序列化程序扩展JsonSerializer & ltFoo>。{
@覆盖
public void serialize(Foo值,JsonGenerator gen,SerializerProvider序列化程序)
引发IOException,JsonProcessingException {
// ...
}
}
公共静态类反序列化程序扩展了JsonDeserializer & ltFoo>。{
@覆盖
public Foo反序列化(JsonParser p,DeserializationContext ctxt)引发IOException,JsonProcessingException {
// ...
}
}
}
测试代码JsonComponentJsonTest:
@回弹测试(class = { jsoncomponentjackcontest . class,FooJsonComponent.class })
@JsonTest
公共类JsonComponentJacksonTest扩展了abstracttestingpringcontexttests {
@自动连线
私人杰克逊公司<。Foo>。json
@测试
public void testSerialize()引发异常{
Foo details = new Foo(“本田”,12);
assert ThAT(this . JSON . write(details))。getJson())。isEqualTo(" name = Honda,age = 12 " ");
}
@测试
public void testDeserialize()引发异常{
String content = " " name = Ford,age = 13
foo actual = this . JSON . ParseObject(content);
assertThat(实际)。isEqualTo(new Foo("Ford ",13));
assertThat(actual.getName())。isEqualTo("福特");
assertThat(actual.getAge())。isEqualTo(13);
}
}
示例3:使用@ContextConfiguration
其实@JsonTest也可以和@ContextConfiguration一起使用。
源代码请参见ThinJsonTest:
@JsonTest
@ Context configuration(class = JSontest . class)
公共类ThinJsonTest扩展了抽象测试规则上下文测试{
@自动连线
私人杰克逊公司<。Foo>。json
@测试
public void testSerialize()引发异常{
// ...
}
@测试
public void testDeserialize()引发异常{
// ...
}
}
@ overrideautonconfiguration
在《弹簧、弹簧靴和测试测试指南(1)》中提到:
除了单元测试(不需要初始化应用程序上下文的测试)之外,尽量保持测试配置与生产配置一致。例如,如果在生产配置中启用了自动配置,那么也应该启用测试配置。因为只有这样才能在测试环境中发现生产环境中的问题,避免因配置不同而出现一些奇怪的问题。
那么当我们想要在测试代码中关闭自动配置时,我们应该怎么做呢?
方法1:提供另一个测试配置
方法2:使用@ OverrideAutoConfiguration
方法1可以很好的解决问题,但是比较麻烦。方法2可以关闭自动配置,而无需更改原始配置或提供新配置。
在本章的示例中,我们创建了一个自动配置类,自动配置启用日志程序:
@配置
公共类AutoConfigurationEnableLogger {
私有静态最终日志记录器=记录器工厂. GetLogger(AutoConfigurationEnableLogger . class);
public AutoConfigurationEnableLogger(){
LOGGER.info("自动配置已启用");
}
}
并在meta-INF/spring.factors中注册:
org . spring framework . boot . auto configure . enable auto configuration =
me . chan jar . annotation . overrideacc . autoconfigurationenablelogger
这样,只要Spring Boot启动自动配置,就会打印一个日志:
2017-08-24 16:44:52.789 INFO 13212-[主]m . c . a . o . Auto configurationenablelogger:自动配置已启用
示例1:自动配置未关闭
有关源代码,请参见引导测试:
@回弹测试
@回弹应用
公共类BootTest扩展了AbstractTestingSpringcontextTests {
@测试
public void testName()引发异常{
}
}
查看输出日志,您会发现自动配置已启用。
示例2:关闭自动配置
然后我们用@ OverrideAutoConfiguration关闭了自动配置。
有关源代码,请参见引导测试:
@回弹测试
@ overrideautonconfiguration(enabled = false)
@回弹应用
公共类BootTest扩展了AbstractTestingSpringcontextTests {
@测试
public void testName()引发异常{
}
}
再次检查输出日志,您会发现自动配置已关闭。
@TestConfiguration
@TestConfiguration是Spring Boot Test提供的一个工具,我们可以用它来补充一般@Configuration之外的特殊Bean或者定制配置进行测试。
@TestConfiguration其实是一种@TestComponent,@TestComponent是另一种@Component,语义上用来指定一个Bean专门用于测试。
特别注意,你要想尽一切办法避免在生产代码中自动扫描@TestComponent。如果您使用@回弹应用程序来启动测试或生成代码,@测试组件将被自动排除。如果没有,您需要添加类型排除过滤器,如@回弹应用程序:
// ...
@组件扫描(排除过滤器= {
@Filter(类型= FilterType。CUSTOM,classes = TypeExcludeFilter.class),
// ...})
public @interface回弹应用程序
示例1:作为内部类
@TestConfiguration与@Configuration不同,它不会阻止@回弹测试找到机制(在第1章:基本用法——使用弹簧启动测试工具——例4中提到)。正如@TestConfiguration的javadoc所说,它只是对现有配置的补充。
因此,我们可以在测试代码中添加@回弹脚配置,使用@回弹脚测试(class =……)或者在同一个包中添加@回弹脚配置类。
而当@TestConfiguration为内部类时,会被@回弹测试扫描,和@Configuration一样。
测试代码测试配置测试:
@回弹测试
@回弹配置
公共类TestConfigurationTest扩展了abstracttestingpringcontexttests {
@自动连线
二等兵Foo foo
@测试
assertequils(foo . GetName(),“来自测试配置”);
}
@TestConfiguration
公共类TestConfig {
@豆
public Foo foo() {
返回新的Foo(“来自测试配置”);
}
}
}
例2:对@Configuration的补充和覆盖
@TestConfiguration可以:
添加额外的Bean
覆盖现有的Bean
特别注意第二点。@TestConfiguration可以直接覆盖现有Bean,而普通@Configuration做不到。
我们首先提供一个普通的@配置(Config):
@配置
公共类Config {
@豆
public Foo foo() {
返回新的Foo(“来自配置”);
}
}
它还提供了@TestConfiguration,它涵盖了foo Bean并提供了foo2 Bean(TestConfig):
@TestConfiguration
公共类TestConfig {
//不需要@Primary这样的机制,可以直接覆盖。
@豆
public Foo foo() {
返回新的Foo(“来自测试配置”);
}
@豆
public Foo foo2() {
返回新的Foo(“来自测试配置2”);
}
}
测试代码测试配置测试:
@回弹测试(类= { Config.class,TestConfig.class })
公共类TestConfigurationTest扩展了abstracttestingpringcontexttests {
@限定符(“foo”)
@自动连线
二等兵Foo foo
@限定符(“foo2”)
@自动连线
private Foo foo2
@测试
assertequils(foo . GetName(),“来自测试配置”);
assertequils(foo 2 . GetName(),“来自测试配置2”);
}
}
再次检查输出日志,您会发现自动配置已关闭。
示例3:避免@TestConfiguration被扫描
上面例子中的TestConfig将被@ComponentScan扫描。如果你想避免被扫描,这篇文章的开头已经提到了。
让我们看看没有任何过滤的情况。我们首先提供一个@回弹配置(包括图):
@回弹配置
@组件扫描
公共接口包括图{
}
然后一个测试代码引用它(TestConfigIncludedTest):
@回弹测试(classes = IncludeConfig.class)
公共类TestConfigIncludedTest扩展了抽象测试pringContextTests {
@Autowired(必选= false)
私有测试配置测试配置;
@测试
assertnotNull(TestConfig);
}
}
您可以从这段代码中看到TestConfig已经加载。
现在我们使用TypeExcludeFilter来过滤@ TestConfiguration(ExcludeFig 1):
@回弹配置
@组件扫描(排除过滤器= {
@ComponentScan。Filter(类型= FilterType。CUSTOM,classes = TypeExcludeFilter.class)
})
公共接口排除图1 {
}
再看看结果(TestConfigExclude_1_Test):
@回弹测试(class = exclude config 1 . class)
公共类TestConfigExclude_1_Test扩展了abstracttestingpringcontexttests {
@Autowired(必选= false)
私有测试配置测试配置;
@测试
公共void测试()引发异常{
assertNull(TestConfig);
}
}
您也可以使用@回弹应用程序排除测试配置(排除图2):
@回弹应用
公共接口排除图2 {
}
看结果(TestConfigExclude_2_Test):
@回弹测试(class = exclude config 2 . class)
公共类TestConfigExclude_2_Test扩展了abstracttestingspringcontexttests {
@Autowired(必选= false)
私有测试配置测试配置;
@测试
assertNull(TestConfig);
}
}
参考文件
Spring框架测试
http://docs . spring . io/spring/docs/4 . 3 . 9 . RElease/spring-framework-reference/html single/# testing
春天开始测试
http://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RELEASE/reference/html single/# boot-features-testing
带有测试属性源的上下文配置
https://docs . spring . io/spring/docs/4 . 3 . 9 . RElease/spring-framework-reference/html/integration-testing . html # test context-CTX-management-property-sources
弹簧框架测试
http://docs . spring . io/spring/docs/4 . 3 . 9 . RElease/spring-framework-reference/html single/# testing
弹簧靴测试
http://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RELEASE/reference/html single/# boot-features-testing
@JsonTest
http://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RELEASE/reference/html single/# boot-features-testing-spring-boot-applications-testing-auto configured-JSON-tests
JsonComponent
http://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RElease/API/org/spring framework/boot/Jackson/JSonComponent . html
杰克逊自动配置
http://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RElease/API/org/spring framework/boot/auto configure/Jackson/Jackson auto configuration . html
杰克逊斯特
http://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RElease/API/org/spring framework/boot/test/JSON/Jackson ontester . html
GsonTester
http://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RElease/API/org/spring framework/boot/test/JSON/GSontester . html
BasicJsonTester
http://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RElease/API/org/spring framework/boot/test/JSON/basicjsonTester . html
检测测试配置
https://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RELEASE/reference/html single/# boot-features-testing-spring-boot-applications-detecting-config
不包括测试配置
https://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RElease/reference/html single/# boot-features-testing-spring-boot-applications-excluding-config
系列
1.《springboottest Spring、Spring Boot 和 TestNG 测试指南》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《springboottest Spring、Spring Boot 和 TestNG 测试指南》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/junshi/1312172.html