当前位置:首页 > 旅游指南

springboottest Spring、Spring Boot 和 TestNG 测试指南

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

上一篇

春晚导演赵安 赵安指挥中国春晚登联合国纽约总部 北美崔哥点赞

下一篇

让水瓶男疯狂的摩羯女 摩羯女能降住水瓶男吗

10秒测男生喜不喜欢你 测试男生喜不喜欢你的测试题 读心术判断男生喜欢你

  • 10秒测男生喜不喜欢你 测试男生喜不喜欢你的测试题 读心术判断男生喜欢你
  • 10秒测男生喜不喜欢你 测试男生喜不喜欢你的测试题 读心术判断男生喜欢你
  • 10秒测男生喜不喜欢你 测试男生喜不喜欢你的测试题 读心术判断男生喜欢你

聊天分析他是否喜欢你 发消息测试对方喜欢你 聊天态度看出他喜欢你

  • 聊天分析他是否喜欢你 发消息测试对方喜欢你 聊天态度看出他喜欢你
  • 聊天分析他是否喜欢你 发消息测试对方喜欢你 聊天态度看出他喜欢你
  • 聊天分析他是否喜欢你 发消息测试对方喜欢你 聊天态度看出他喜欢你
网络测试分析仪 射频测试基础——网络分析与网络分析仪

网络测试分析仪 射频测试基础——网络分析与网络分析仪

由几个电气元件连接而成的系统称为网络。“网络”可以作为电路的代名词,“网络分析”就是电路分析,但很少这么说,这就增加了一点神秘感。在射频通信领域,任何有一个以上端口的电路单元都可以称为网络,而这个网络往往被视为一个“黑匣子”。不是关注电路单元内...

李洪志百度百科 李洪志敢接受“神功测试”吗?

  • 李洪志百度百科 李洪志敢接受“神功测试”吗?
  • 李洪志百度百科 李洪志敢接受“神功测试”吗?
  • 李洪志百度百科 李洪志敢接受“神功测试”吗?

测试水瓶男喜不喜欢你 水瓶座男生喜欢一个人的表现 准到爆

  • 测试水瓶男喜不喜欢你 水瓶座男生喜欢一个人的表现 准到爆
  • 测试水瓶男喜不喜欢你 水瓶座男生喜欢一个人的表现 准到爆
  • 测试水瓶男喜不喜欢你 水瓶座男生喜欢一个人的表现 准到爆

环境应急预案 什么是环境应急预案?哪些企业要做预案?

  • 环境应急预案 什么是环境应急预案?哪些企业要做预案?
  • 环境应急预案 什么是环境应急预案?哪些企业要做预案?
  • 环境应急预案 什么是环境应急预案?哪些企业要做预案?

分贝测试 星巴克杭州8店声音分贝测试报告:我们看到了这些

  • 分贝测试 星巴克杭州8店声音分贝测试报告:我们看到了这些
  • 分贝测试 星巴克杭州8店声音分贝测试报告:我们看到了这些
  • 分贝测试 星巴克杭州8店声音分贝测试报告:我们看到了这些
胶带剥离力测试仪 电脑式胶粘带剥离力测试仪

胶带剥离力测试仪 电脑式胶粘带剥离力测试仪

[产品描述] 基于计算机的胶带剥离力测试仪由计算机控制,广泛用于测试橡胶、塑料、电线电缆、纺织品、防水材料和无纺布等非金属材料,以及金属线材、金属箔、金属板和金属棒材的力学性能。也适用于各种成品拉伸、压缩、剥离、剪切、撕裂、弯曲(折叠)试验,使...