摘要:地址是提供的一種工具,用它我們可以在一般的之外補充測試專門用的或者自定義的配置。實際上是一種,是另一種,在語義上用來指定某個是專門用于測試的。所以我們在測試代碼上添加,用或者在同里添加類都是可以的。
Github地址
@TestConfiguration是Spring Boot Test提供的一種工具,用它我們可以在一般的@Configuration之外補充測試專門用的Bean或者自定義的配置。
@TestConfiguration實際上是一種@TestComponent,@TestComponent是另一種@Component,在語義上用來指定某個Bean是專門用于測試的。
需要特別注意,你應(yīng)該使用一切辦法避免在生產(chǎn)代碼中自動掃描到@TestComponent。
如果你使用@SpringBootApplication啟動測試或者生產(chǎn)代碼,@TestComponent會自動被排除掉,如果不是則需要像@SpringBootApplication一樣添加TypeExcludeFilter:
//... @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), // ...}) public @interface SpringBootApplication例子1:作為內(nèi)部類
@TestConfiguration和@Configuration不同,它不會阻止@SpringBootTest去查找機制(在Chapter 1: 基本用法 - 使用Spring Boot Testing工具 - 例子4提到過),正如@TestConfiguration的javadoc所說,它只是對既有配置的一個補充。
所以我們在測試代碼上添加@SpringBootConfiguration,用@SpringBootTest(classes=...)或者在同package里添加@SpringBootConfiguration類都是可以的。
而且@TestConfiguration作為內(nèi)部類的時候它是會被@SpringBootTest掃描掉的,這點和@Configuration一樣。
測試代碼TestConfigurationTest:
@SpringBootTest @SpringBootConfiguration public class TestConfigurationTest extends AbstractTestNGSpringContextTests { @Autowired private Foo foo; @Test public void testPlusCount() throws Exception { assertEquals(foo.getName(), "from test config"); } @TestConfiguration public class TestConfig { @Bean public Foo foo() { return new Foo("from test config"); } } }例子2:對@Configuration的補充和覆蓋
@TestConfiguration能夠:
補充額外的Bean
覆蓋已存在的Bean
要特別注意第二點,@TestConfiguration能夠直接覆蓋已存在的Bean,這一點正常的@Configuration是做不到的。
我們先提供了一個正常的@Configuration(Config):
@Configuration public class Config { @Bean public Foo foo() { return new Foo("from config"); } }
又提供了一個@TestConfiguration,在里面覆蓋了foo Bean,并且提供了foo2 Bean(TestConfig):
@TestConfiguration public class TestConfig { // 這里不需要@Primary之類的機制,直接就能夠覆蓋 @Bean public Foo foo() { return new Foo("from test config"); } @Bean public Foo foo2() { return new Foo("from test config2"); } }
測試代碼TestConfigurationTest:
@SpringBootTest(classes = { Config.class, TestConfig.class }) public class TestConfigurationTest extends AbstractTestNGSpringContextTests { @Qualifier("foo") @Autowired private Foo foo; @Qualifier("foo2") @Autowired private Foo foo2; @Test public void testPlusCount() throws Exception { assertEquals(foo.getName(), "from test config"); assertEquals(foo2.getName(), "from test config2"); } }
再查看輸出的日志,就會發(fā)現(xiàn)Auto Configuration已經(jīng)關(guān)閉。
例子3:避免@TestConfiguration被掃描到在上面的這個例子里的TestConfig是會被@ComponentScan掃描到的,如果要避免被掃描到,在本文開頭已經(jīng)提到過了。
先來看一下沒有做任何過濾的情形,我們先提供了一個@SpringBootConfiguration(IncludeConfig):
@SpringBootConfiguration @ComponentScan public interface IncludeConfig { }
然后有個測試代碼引用了它(TestConfigIncludedTest):
@SpringBootTest(classes = IncludeConfig.class) public class TestConfigIncludedTest extends AbstractTestNGSpringContextTests { @Autowired(required = false) private TestConfig testConfig; @Test public void testPlusCount() throws Exception { assertNotNull(testConfig); } }
從這段代碼可以看到TestConfig被加載了。
現(xiàn)在我們使用TypeExcludeFilter來過濾@TestConfiguration(ExcludeConfig1):
@SpringBootConfiguration @ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class) }) public interface ExcludeConfig1 { }
再來看看結(jié)果(TestConfigExclude_1_Test):
@SpringBootTest(classes = ExcludeConfig1.class) public class TestConfigExclude_1_Test extends AbstractTestNGSpringContextTests { @Autowired(required = false) private TestConfig testConfig; @Test public void test() throws Exception { assertNull(testConfig); } }
還可以用@SpringBootApplication來排除TestConfig(ExcludeConfig2):
@SpringBootApplication public interface ExcludeConfig2 { }
看看結(jié)果(TestConfigExclude_2_Test):
@SpringBootTest(classes = ExcludeConfig2.class) public class TestConfigExclude_2_Test extends AbstractTestNGSpringContextTests { @Autowired(required = false) private TestConfig testConfig; @Test public void testPlusCount() throws Exception { assertNull(testConfig); } }參考文檔
Spring Framework Testing
Spring Boot Testing
Detecting test configuration
Excluding test configuration
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70309.html
摘要:地址提供了,能夠很方便的來測試。同時也提供了更進一步簡化了測試需要的配置工作。本章節(jié)將分別舉例說明在不使用和使用下如何對進行測試。例子測試的關(guān)鍵是使用對象,利用它我們能夠在不需啟動容器的情況下測試的行為。 Github地址 Spring Testing Framework提供了Spring MVC Test Framework,能夠很方便的來測試Controller。同時Spring...
摘要:因為只有這樣才能夠在測試環(huán)境下發(fā)現(xiàn)生產(chǎn)環(huán)境的問題,也避免出現(xiàn)一些因為配置不同導致的奇怪問題。而方法則能夠不改變原有配置不提供新的配置的情況下,就能夠關(guān)閉。 Github地址 在Chapter 1: 基本用法 - 使用Spring Boot Testing工具里提到: 除了單元測試(不需要初始化ApplicationContext的測試)外,盡量將測試配置和生產(chǎn)配置保持一致。比如如果生產(chǎn)...
摘要:地址是提供的方便測試序列化反序列化的測試工具,在的文檔中有一些介紹。例子簡單例子源代碼見使用通包下的文件測試結(jié)果是否正確或者使用基于的校驗例子測試可以用來測試。這個例子里使用了自定義的測試代碼例子使用事實上也可以配合一起使用。 Github地址 @JsonTest是Spring Boot提供的方便測試JSON序列化反序列化的測試工具,在Spring Boot的文檔中有一些介紹。 需要注...
摘要:源代碼見需要注意的是,如果是專供某個測試類使用的話,把它放到外部并不是一個好主意,因為它有可能會被掃描到,從而產(chǎn)生一些奇怪的問題。 Github地址 既然我們現(xiàn)在開發(fā)的是一個Spring項目,那么肯定會用到Spring Framework的各種特性,這些特性實在是太好用了,它能夠大大提高我們的開發(fā)效率。那么自然而然,你會想在測試代碼里也能夠利用Spring Framework提供的特...
摘要:地址在使用工具中提到在測試代碼之間盡量做到配置共用。本章將列舉幾種共享測試配置的方法我們可以將測試配置放在一個里,然后在測試或中引用它。也可以利用的及自定義機制,提供自己的用在測試配置上。 Github地址 在使用Spring Boot Testing工具中提到: 在測試代碼之間盡量做到配置共用。...能夠有效利用Spring TestContext Framework的緩存機制,Ap...
閱讀 2065·2021-10-11 10:59
閱讀 924·2021-09-23 11:21
閱讀 3541·2021-09-06 15:02
閱讀 1610·2021-08-19 10:25
閱讀 3364·2021-07-30 11:59
閱讀 2362·2019-08-30 11:27
閱讀 2574·2019-08-30 11:20
閱讀 2964·2019-08-29 13:15