github.com/chanjarster/spring-test-examples
Spring&Spring Boot測(cè)試工具提供了一些便于測(cè)試的注釋,本文將解釋其中的一些。
@TestPropertySource
@TestPropertySource可用于覆蓋系統(tǒng)環(huán)境變量、Java系統(tǒng)屬性和@PropertySource屬性。
同時(shí),@ test property source(properties =…)比@ test property source(locations =…)具有更高的優(yōu)先級(jí)。
使用它,我們可以很容易地在測(cè)試代碼中對(duì)配置進(jìn)行微調(diào)和模擬(比如修改操作系統(tǒng)目錄分隔符、數(shù)據(jù)源等)。).
示例1:使用彈簧測(cè)試工具
我們首先使用@PropertySource加載一個(gè)外部屬性文件,PropertySourceConfig:
@配置
@ PrOperty SOURce(" class path:me/chan jar/annotation/testps/ex1/property-SOURce . properties ")
公共類(lèi)PropertySourceConfig {
}
文件:property-source.properties
foo=abc
然后我們用@TestPropertySource覆蓋了這個(gè)特性:
TestPropertySource(properties = { " foo = XYZ "...
最后,我們測(cè)試了覆蓋是否成功(結(jié)果是成功的):
@測(cè)試
public void TestOverridePropertySource(){
AssertEquals(環(huán)境?!癤YZ”。
}
同時(shí)我們?cè)贎TestPropertySource上做了一些其他的測(cè)試,具體情況你可以自己觀察。為了方便大家觀察@TestPropertySource對(duì)系統(tǒng)環(huán)境變量和Java系統(tǒng)屬性的覆蓋效果,我們?cè)陂_(kāi)始就打印出了它們的值。
源代碼測(cè)試屬性測(cè)試:
@ Context configuration(class = PropertySourceConfig。類(lèi))
@TestPropertySource(
attribute = {“rich = XYZ”,“ba = UVW”,“PATH = AAA”,“Java . runtime . name = BBB”},
location = " class path:I/chanjar/annotation/testps/ex1/test-property-source . properties "
)
公共類(lèi)TestPropertyTest擴(kuò)展了abstracttestingspringcontexttests來(lái)實(shí)現(xiàn)EnvironmentAware {
私人環(huán)境環(huán)境;
@覆蓋
無(wú)效的公共設(shè)置環(huán)境{
這個(gè)。環(huán)境=環(huán)境;
地圖<。字符串,對(duì)象>;系統(tǒng)環(huán)境=((可配置環(huán)境)環(huán)境)。getSystemEnvironment();
系統(tǒng)。出去。Println ("= = =系統(tǒng)環(huán)境= = ";
系統(tǒng)。出去。Println of (getmapstring(系統(tǒng)環(huán)境));
系統(tǒng)。出去。println()of;
系統(tǒng)。出去。Println ("= = = Java系統(tǒng)屬性= = ";
地圖<。字符串,對(duì)象>;系統(tǒng)屬性=((可配置環(huán)境)環(huán)境)。getSystemProperties();
系統(tǒng)。出去。Println of (getmapstring(系統(tǒng)屬性));
}
@測(cè)試
public void TestOverridePropertySource(){
AssertEquals(環(huán)境?!癤YZ”。
}
@測(cè)試
public void testOverrideSystemEnvironment(){
AssertEquals(環(huán)境。Getproperty ("path ")," AAA ");
}
@測(cè)試
public void testOverrideJavaSystemProperties(){
AssertEquals(環(huán)境。getproperty of(" Java . runtime . name ")," BBB ");
}
@測(cè)試
public void testinlinetestpropertyroverrideresourcelocationtestproperty(){
AssertEquals(環(huán)境?!拔恼隆保琔VW。
}
私有字符串獲取映射字符串(映射& lt字符串,對(duì)象>;地圖){
返回字符串.加(" n ",
地圖。密鑰集().stream().Map (k->: +"="+map。Get (k))。收集(toList())
);
}
}
示例2:使用彈簧啟動(dòng)測(cè)試工具
@TestPropertySource也可以與@ RibbootTest一起使用。
有關(guān)源代碼,請(qǐng)參見(jiàn)測(cè)試屬性測(cè)試:
@回彈測(cè)試(class = PropertySourceConfig。類(lèi))
@TestPropertySource(
attribute = {“rich = XYZ”,“ba = UVW”,“PATH = AAA”,“Java . runtime . name = BBB”},
location = " class path:I/chanjar/annotation/testps/ex1/test-property-source . properties "
)
公共類(lèi)TestPropertyTest擴(kuò)展了abstracttestingspringcontexttests來(lái)實(shí)現(xiàn)EnvironmentAware {
// ..
@活動(dòng)配置文件
@ActiveProfiles可用于在測(cè)試期間啟用一些數(shù)據(jù)beans。本章中的測(cè)試代碼使用以下配置:
@配置
公共類(lèi)Config {
@豆
@個(gè)人資料(“開(kāi)發(fā)”)
public Foo fooDev(){
返回新Foo(“開(kāi)發(fā)”);
}
@豆
@簡(jiǎn)介(“產(chǎn)品”)
public Foo fooProduct(){
退回新Foo(“產(chǎn)品”);
}
@豆
@配置文件(“默認(rèn)”)
public Foo fooDefault(){
返回新的Foo(“默認(rèn)”);
}
@豆
public bar bar(){
返回新欄(“無(wú)簡(jiǎn)介”);
}
}
示例1:不要使用活動(dòng)配置文件
當(dāng)沒(méi)有@ActiveProfiles時(shí),shape = default且沒(méi)有配置文件的beans將被加載到。
源代碼活動(dòng)配置文件測(cè)試:
@ Context configuration(class = configuration。類(lèi))
公共類(lèi)ActiveProfileTest擴(kuò)展了abstracttestngspringcontexttests {
@自動(dòng)連線
二等兵Foo foo
@自動(dòng)連線
私人酒吧;
@測(cè)試
public void test(){
assertequils(FOO)。GetName () of," default ");
assertequils(ba。GetName () of," no profile ");
}
}
示例2:使用活動(dòng)配置文件
當(dāng)使用@ActiveProfiles時(shí),具有配置文件匹配且沒(méi)有配置文件的beans將被加載到。
源代碼活動(dòng)配置文件測(cè)試:
@ Context configuration(class = configuration。類(lèi))
[@活動(dòng)配置文件][文檔-活動(dòng)-配置文件](“產(chǎn)品”)
公共類(lèi)ActiveProfileTest擴(kuò)展了抽象測(cè)試pringContextTests {
@自動(dòng)連線
二等兵Foo foo
@自動(dòng)連線
私人酒吧;
@測(cè)試
public void test(){
assertequils(FOO)。GetName()," product ");
assertequils(ba。GetName () of," no profile ");
}
}
摘要
當(dāng)沒(méi)有@ActiveProfiles時(shí),shape = default且沒(méi)有配置文件的beans將被加載到。
當(dāng)使用@ActiveProfiles時(shí),具有配置文件匹配且沒(méi)有配置文件的beans將被加載到。
@ActiveProfiles也可以與@回彈測(cè)試結(jié)合使用,這里不做說(shuō)明。
@JsonTest
@JsonTest是Spring Boot提供的方便的測(cè)試JSON序列化和反序列化的測(cè)試工具,Spring Boot的文檔中有介紹。
需要注意的是@JsonTest需要杰克遜的ObjectMapper。事實(shí)上,如果您的Spring Boot項(xiàng)目添加了spring-web的Maven依賴項(xiàng),JacksonAutoConfiguration會(huì)自動(dòng)為您配置一個(gè):
& 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>。
這里沒(méi)有日期和時(shí)間的例子,但這很復(fù)雜。請(qǐng)參考我的另一篇文章:Spring Boot Jackson處理日期和時(shí)間類(lèi)型的例子。
https://github . com/chanjarster/springoot-Jackson-datetime-示例
例子1:簡(jiǎn)單的例子
源代碼見(jiàn)SimpleJsonTest:
@回彈測(cè)試(classes = SimpleJsonTest.class)
@JsonTest
公共類(lèi)SimpleJsonTest擴(kuò)展了抽象測(cè)試pringContextTests {
@自動(dòng)連線
私人杰克遜公司<。Foo>。json
@測(cè)試
public void testSerialize()引發(fā)異常{
Foo details = new Foo(“本田”,12);
//使用交鑰匙下的json文件測(cè)試結(jié)果是否正確
assert ThAT(this . JSON . write(details))。isEqualToJson("應(yīng)為. JSON ");
//或者使用JSON基于路徑的驗(yàn)證
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);
}
@測(cè)試
public void testDeserialize()引發(fā)異常{
String content = "{"name":"Ford "," age ":13 } ";
foo actual = this . JSON . ParseObject(content);
assertThat(實(shí)際)。isEqualTo(new Foo("Ford ",13));
assertThat(actual.getName())。isEqualTo("福特");
assertThat(actual.getAge())。isEqualTo(13);
}
}
示例2: test @JsonComponent
@JsonTest可以用來(lái)測(cè)試@JsonComponent。
在本例中,使用了用戶定義的@JsonComponent FooJsonComponent:
@JsonComponent
public class FooJsonComponent {
公共靜態(tài)類(lèi)序列化程序擴(kuò)展JsonSerializer & ltFoo>。{
@覆蓋
public void serialize(Foo值,JsonGenerator gen,SerializerProvider序列化程序)
引發(fā)IOException,JsonProcessingException {
// ...
}
}
公共靜態(tài)類(lèi)反序列化程序擴(kuò)展了JsonDeserializer & ltFoo>。{
@覆蓋
public Foo反序列化(JsonParser p,DeserializationContext ctxt)引發(fā)IOException,JsonProcessingException {
// ...
}
}
}
測(cè)試代碼JsonComponentJsonTest:
@回彈測(cè)試(class = { jsoncomponentjackcontest . class,F(xiàn)ooJsonComponent.class })
@JsonTest
公共類(lèi)JsonComponentJacksonTest擴(kuò)展了abstracttestingpringcontexttests {
@自動(dòng)連線
私人杰克遜公司<。Foo>。json
@測(cè)試
public void testSerialize()引發(fā)異常{
Foo details = new Foo(“本田”,12);
assert ThAT(this . JSON . write(details))。getJson())。isEqualTo(" name = Honda,age = 12 " ");
}
@測(cè)試
public void testDeserialize()引發(fā)異常{
String content = " " name = Ford,age = 13
foo actual = this . JSON . ParseObject(content);
assertThat(實(shí)際)。isEqualTo(new Foo("Ford ",13));
assertThat(actual.getName())。isEqualTo("福特");
assertThat(actual.getAge())。isEqualTo(13);
}
}
示例3:使用@ContextConfiguration
其實(shí)@JsonTest也可以和@ContextConfiguration一起使用。
源代碼請(qǐng)參見(jiàn)ThinJsonTest:
@JsonTest
@ Context configuration(class = JSontest . class)
公共類(lèi)ThinJsonTest擴(kuò)展了抽象測(cè)試規(guī)則上下文測(cè)試{
@自動(dòng)連線
私人杰克遜公司<。Foo>。json
@測(cè)試
public void testSerialize()引發(fā)異常{
// ...
}
@測(cè)試
public void testDeserialize()引發(fā)異常{
// ...
}
}
@ overrideautonconfiguration
在《彈簧、彈簧靴和測(cè)試測(cè)試指南(1)》中提到:
除了單元測(cè)試(不需要初始化應(yīng)用程序上下文的測(cè)試)之外,盡量保持測(cè)試配置與生產(chǎn)配置一致。例如,如果在生產(chǎn)配置中啟用了自動(dòng)配置,那么也應(yīng)該啟用測(cè)試配置。因?yàn)橹挥羞@樣才能在測(cè)試環(huán)境中發(fā)現(xiàn)生產(chǎn)環(huán)境中的問(wèn)題,避免因配置不同而出現(xiàn)一些奇怪的問(wèn)題。
那么當(dāng)我們想要在測(cè)試代碼中關(guān)閉自動(dòng)配置時(shí),我們應(yīng)該怎么做呢?
方法1:提供另一個(gè)測(cè)試配置
方法2:使用@ OverrideAutoConfiguration
方法1可以很好的解決問(wèn)題,但是比較麻煩。方法2可以關(guān)閉自動(dòng)配置,而無(wú)需更改原始配置或提供新配置。
在本章的示例中,我們創(chuàng)建了一個(gè)自動(dòng)配置類(lèi),自動(dòng)配置啟用日志程序:
@配置
公共類(lèi)AutoConfigurationEnableLogger {
私有靜態(tài)最終日志記錄器=記錄器工廠. GetLogger(AutoConfigurationEnableLogger . class);
public AutoConfigurationEnableLogger(){
LOGGER.info("自動(dòng)配置已啟用");
}
}
并在meta-INF/spring.factors中注冊(cè):
org . spring framework . boot . auto configure . enable auto configuration =
me . chan jar . annotation . overrideacc . autoconfigurationenablelogger
這樣,只要Spring Boot啟動(dòng)自動(dòng)配置,就會(huì)打印一個(gè)日志:
2017-08-24 16:44:52.789 INFO 13212-[主]m . c . a . o . Auto configurationenablelogger:自動(dòng)配置已啟用
示例1:自動(dòng)配置未關(guān)閉
有關(guān)源代碼,請(qǐng)參見(jiàn)引導(dǎo)測(cè)試:
@回彈測(cè)試
@回彈應(yīng)用
公共類(lèi)BootTest擴(kuò)展了AbstractTestingSpringcontextTests {
@測(cè)試
public void testName()引發(fā)異常{
}
}
查看輸出日志,您會(huì)發(fā)現(xiàn)自動(dòng)配置已啟用。
示例2:關(guān)閉自動(dòng)配置
然后我們用@ OverrideAutoConfiguration關(guān)閉了自動(dòng)配置。
有關(guān)源代碼,請(qǐng)參見(jiàn)引導(dǎo)測(cè)試:
@回彈測(cè)試
@ overrideautonconfiguration(enabled = false)
@回彈應(yīng)用
公共類(lèi)BootTest擴(kuò)展了AbstractTestingSpringcontextTests {
@測(cè)試
public void testName()引發(fā)異常{
}
}
再次檢查輸出日志,您會(huì)發(fā)現(xiàn)自動(dòng)配置已關(guān)閉。
@TestConfiguration
@TestConfiguration是Spring Boot Test提供的一個(gè)工具,我們可以用它來(lái)補(bǔ)充一般@Configuration之外的特殊Bean或者定制配置進(jìn)行測(cè)試。
@TestConfiguration其實(shí)是一種@TestComponent,@TestComponent是另一種@Component,語(yǔ)義上用來(lái)指定一個(gè)Bean專門(mén)用于測(cè)試。
特別注意,你要想盡一切辦法避免在生產(chǎn)代碼中自動(dòng)掃描@TestComponent。如果您使用@回彈應(yīng)用程序來(lái)啟動(dòng)測(cè)試或生成代碼,@測(cè)試組件將被自動(dòng)排除。如果沒(méi)有,您需要添加類(lèi)型排除過(guò)濾器,如@回彈應(yīng)用程序:
// ...
@組件掃描(排除過(guò)濾器= {
@Filter(類(lèi)型= FilterType。CUSTOM,classes = TypeExcludeFilter.class),
// ...})
public @interface回彈應(yīng)用程序
示例1:作為內(nèi)部類(lèi)
@TestConfiguration與@Configuration不同,它不會(huì)阻止@回彈測(cè)試找到機(jī)制(在第1章:基本用法——使用彈簧啟動(dòng)測(cè)試工具——例4中提到)。正如@TestConfiguration的javadoc所說(shuō),它只是對(duì)現(xiàn)有配置的補(bǔ)充。
因此,我們可以在測(cè)試代碼中添加@回彈腳配置,使用@回彈腳測(cè)試(class =……)或者在同一個(gè)包中添加@回彈腳配置類(lèi)。
而當(dāng)@TestConfiguration為內(nèi)部類(lèi)時(shí),會(huì)被@回彈測(cè)試掃描,和@Configuration一樣。
測(cè)試代碼測(cè)試配置測(cè)試:
@回彈測(cè)試
@回彈配置
公共類(lèi)TestConfigurationTest擴(kuò)展了abstracttestingpringcontexttests {
@自動(dòng)連線
二等兵Foo foo
@測(cè)試
assertequils(foo . GetName(),“來(lái)自測(cè)試配置”);
}
@TestConfiguration
公共類(lèi)TestConfig {
@豆
public Foo foo() {
返回新的Foo(“來(lái)自測(cè)試配置”);
}
}
}
例2:對(duì)@Configuration的補(bǔ)充和覆蓋
@TestConfiguration可以:
添加額外的Bean
覆蓋現(xiàn)有的Bean
特別注意第二點(diǎn)。@TestConfiguration可以直接覆蓋現(xiàn)有Bean,而普通@Configuration做不到。
我們首先提供一個(gè)普通的@配置(Config):
@配置
公共類(lèi)Config {
@豆
public Foo foo() {
返回新的Foo(“來(lái)自配置”);
}
}
它還提供了@TestConfiguration,它涵蓋了foo Bean并提供了foo2 Bean(TestConfig):
@TestConfiguration
公共類(lèi)TestConfig {
//不需要@Primary這樣的機(jī)制,可以直接覆蓋。
@豆
public Foo foo() {
返回新的Foo(“來(lái)自測(cè)試配置”);
}
@豆
public Foo foo2() {
返回新的Foo(“來(lái)自測(cè)試配置2”);
}
}
測(cè)試代碼測(cè)試配置測(cè)試:
@回彈測(cè)試(類(lèi)= { Config.class,TestConfig.class })
公共類(lèi)TestConfigurationTest擴(kuò)展了abstracttestingpringcontexttests {
@限定符(“foo”)
@自動(dòng)連線
二等兵Foo foo
@限定符(“foo2”)
@自動(dòng)連線
private Foo foo2
@測(cè)試
assertequils(foo . GetName(),“來(lái)自測(cè)試配置”);
assertequils(foo 2 . GetName(),“來(lái)自測(cè)試配置2”);
}
}
再次檢查輸出日志,您會(huì)發(fā)現(xiàn)自動(dòng)配置已關(guān)閉。
示例3:避免@TestConfiguration被掃描
上面例子中的TestConfig將被@ComponentScan掃描。如果你想避免被掃描,這篇文章的開(kāi)頭已經(jīng)提到了。
讓我們看看沒(méi)有任何過(guò)濾的情況。我們首先提供一個(gè)@回彈配置(包括圖):
@回彈配置
@組件掃描
公共接口包括圖{
}
然后一個(gè)測(cè)試代碼引用它(TestConfigIncludedTest):
@回彈測(cè)試(classes = IncludeConfig.class)
公共類(lèi)TestConfigIncludedTest擴(kuò)展了抽象測(cè)試pringContextTests {
@Autowired(必選= false)
私有測(cè)試配置測(cè)試配置;
@測(cè)試
assertnotNull(TestConfig);
}
}
您可以從這段代碼中看到TestConfig已經(jīng)加載。
現(xiàn)在我們使用TypeExcludeFilter來(lái)過(guò)濾@ TestConfiguration(ExcludeFig 1):
@回彈配置
@組件掃描(排除過(guò)濾器= {
@ComponentScan。Filter(類(lèi)型= FilterType。CUSTOM,classes = TypeExcludeFilter.class)
})
公共接口排除圖1 {
}
再看看結(jié)果(TestConfigExclude_1_Test):
@回彈測(cè)試(class = exclude config 1 . class)
公共類(lèi)TestConfigExclude_1_Test擴(kuò)展了abstracttestingpringcontexttests {
@Autowired(必選= false)
私有測(cè)試配置測(cè)試配置;
@測(cè)試
公共void測(cè)試()引發(fā)異常{
assertNull(TestConfig);
}
}
您也可以使用@回彈應(yīng)用程序排除測(cè)試配置(排除圖2):
@回彈應(yīng)用
公共接口排除圖2 {
}
看結(jié)果(TestConfigExclude_2_Test):
@回彈測(cè)試(class = exclude config 2 . class)
公共類(lèi)TestConfigExclude_2_Test擴(kuò)展了abstracttestingspringcontexttests {
@Autowired(必選= false)
私有測(cè)試配置測(cè)試配置;
@測(cè)試
assertNull(TestConfig);
}
}
參考文件
Spring框架測(cè)試
http://docs . spring . io/spring/docs/4 . 3 . 9 . RElease/spring-framework-reference/html single/# testing
春天開(kāi)始測(cè)試
http://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RELEASE/reference/html single/# boot-features-testing
帶有測(cè)試屬性源的上下文配置
https://docs . spring . io/spring/docs/4 . 3 . 9 . RElease/spring-framework-reference/html/integration-testing . html # test context-CTX-management-property-sources
彈簧框架測(cè)試
http://docs . spring . io/spring/docs/4 . 3 . 9 . RElease/spring-framework-reference/html single/# testing
彈簧靴測(cè)試
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
杰克遜自動(dòng)配置
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
檢測(cè)測(cè)試配置
https://docs . spring . io/spring-boot/docs/1 . 5 . 4 . RELEASE/reference/html single/# boot-features-testing-spring-boot-applications-detecting-config
不包括測(cè)試配置
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 測(cè)試指南》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。
2.《springboottest Spring、Spring Boot 和 TestNG 測(cè)試指南》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/junshi/1312172.html