成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring、Spring Boot和TestNG測(cè)試指南 - 使用Spring Boot Test

Anshiii / 1592人閱讀

摘要:地址前面一個(gè)部分講解了如何使用工具來(lái)測(cè)試項(xiàng)目,現(xiàn)在我們講解如何使用工具來(lái)測(cè)試項(xiàng)目。所以我們可以利用這個(gè)特性來(lái)進(jìn)一步簡(jiǎn)化測(cè)試代碼。因?yàn)橹挥羞@樣才能夠在測(cè)試環(huán)境下發(fā)現(xiàn)生產(chǎn)環(huán)境的問(wèn)題,也避免出現(xiàn)一些因?yàn)榕渲貌煌瑢?dǎo)致的奇怪問(wèn)題。

Github地址

前面一個(gè)部分講解了如何使用Spring Testing工具來(lái)測(cè)試Spring項(xiàng)目,現(xiàn)在我們講解如何使用Spring Boot Testing工具來(lái)測(cè)試Spring Boot項(xiàng)目。

在Spring Boot項(xiàng)目里既可以使用Spring Boot Testing工具,也可以使用Spring Testing工具。
在Spring項(xiàng)目里,一般使用Spring Testing工具,雖然理論上也可以使用Spring Boot Testing,不過(guò)因?yàn)镾pring Boot Testing工具會(huì)引入Spring Boot的一些特性比如AutoConfiguration,這可能會(huì)給你的測(cè)試帶來(lái)一些奇怪的問(wèn)題,所以一般不推薦這樣做。

例子1:直接加載Bean

使用Spring Boot Testing工具只需要將@ContextConfiguration改成@SpringBootTest即可,源代碼見FooServiceImpltest:

@SpringBootTest(classes = FooServiceImpl.class)
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {

  @Autowired
  private FooService foo;

  @Test
  public void testPlusCount() throws Exception {
    assertEquals(foo.getCount(), 0);

    foo.plusCount();
    assertEquals(foo.getCount(), 1);
  }

}
例子2:使用內(nèi)嵌@Configuration加載Bean

源代碼見FooServiceImpltest:

@SpringBootTest
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {

  @Autowired
  private FooService foo;

  @Test
  public void testPlusCount() throws Exception {
    assertEquals(foo.getCount(), 0);

    foo.plusCount();
    assertEquals(foo.getCount(), 1);
  }

  @Configuration
  @Import(FooServiceImpl.class)
  static class Config {
  }

}
例子3:使用外部@Configuration加載Bean

Config:

@Configuration
@Import(FooServiceImpl.class)
public class Config {
}

FooServiceImpltest:

@SpringBootTest(classes = Config.class)
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {

  @Autowired
  private FooService foo;

  @Test
  public void testPlusCount() throws Exception {
    assertEquals(foo.getCount(), 0);

    foo.plusCount();
    assertEquals(foo.getCount(), 1);
  }

}

這個(gè)例子和例子2差不多,只不過(guò)將@Configuration放到了外部。

例子4:使用@SpringBootConfiguration

前面的例子@SpringBootTest的用法和@ContextConfiguration差不多。不過(guò)根據(jù)@SpringBootTest的文檔:

它會(huì)嘗試加載@SpringBootTest(classes=...)的定義的Annotated classes。Annotated classes的定義在ContextConfiguration中有說(shuō)明。

如果沒(méi)有設(shè)定@SpringBootTest(classes=...),那么會(huì)去找當(dāng)前測(cè)試類的nested @Configuration class

如果上一步找到,則會(huì)嘗試查找@SpringBootConfiguration,查找的路徑有:1)看當(dāng)前測(cè)試類是否@SpringBootConfiguration,2)在當(dāng)前測(cè)試類所在的package里找。

所以我們可以利用這個(gè)特性來(lái)進(jìn)一步簡(jiǎn)化測(cè)試代碼。

Config:

@SpringBootConfiguration
@Import(FooServiceImpl.class)
public class Config {
}

FooServiceImpltest:

@SpringBootTest
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {

  @Autowired
  private FooService foo;

  @Test
  public void testPlusCount() throws Exception {
    assertEquals(foo.getCount(), 0);

    foo.plusCount();
    assertEquals(foo.getCount(), 1);
  }

}
例子5:使用@ComponentScan掃描Bean

前面的例子我們都使用@Import來(lái)加載Bean,雖然這中方法很精確,但是在大型項(xiàng)目中很麻煩。

在常規(guī)的Spring Boot項(xiàng)目中,一般都是依靠自動(dòng)掃描機(jī)制來(lái)加載Bean的,所以我們希望我們的測(cè)試代碼也能夠利用自動(dòng)掃描機(jī)制來(lái)加載Bean。

Config:

@SpringBootConfiguration
@ComponentScan(basePackages = "me.chanjar.basic.service")
public class Config {
}

FooServiceImpltest:

@SpringBootTest
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {

  @Autowired
  private FooService foo;

  @Test
  public void testPlusCount() throws Exception {
    assertEquals(foo.getCount(), 0);

    foo.plusCount();
    assertEquals(foo.getCount(), 1);
  }

}
例子6:使用@SpringBootApplication

也可以在測(cè)試代碼上使用@SpringBootApplication,它有這么幾個(gè)好處:

自身SpringBootConfiguration

提供了@ComponentScan配置,以及默認(rèn)的excludeFilter,有了這些filter Spring在初始化ApplicationContext的時(shí)候會(huì)排除掉某些Bean和@Configuration

啟用了EnableAutoConfiguration,這個(gè)特性能夠利用Spring Boot來(lái)自動(dòng)化配置所需要的外部資源,比如數(shù)據(jù)庫(kù)、JMS什么的,這在集成測(cè)試的時(shí)候非常有用。

Config:

@SpringBootApplication(scanBasePackages = "me.chanjar.basic.service")
public class Config {
}

FooServiceImpltest:

@SpringBootTest
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {

  @Autowired
  private FooService foo;

  @Test
  public void testPlusCount() throws Exception {
    assertEquals(foo.getCount(), 0);

    foo.plusCount();
    assertEquals(foo.getCount(), 1);
  }

}
避免@SpringBootConfiguration沖突

當(dāng)@SpringBootTest沒(méi)有定義(classes=...,且沒(méi)有找到nested @Configuration class的情況下,會(huì)嘗試查詢@SpringBootConfiguration,如果找到多個(gè)的話則會(huì)拋出異常:

Caused by: java.lang.IllegalStateException: Found multiple @SpringBootConfiguration annotated classes [Generic bean: class [...]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [/Users/qianjia/workspace-os/spring-test-examples/basic/target/test-classes/me/chanjar/basic/springboot/ex7/FooServiceImplTest1.class], Generic bean: class [me.chanjar.basic.springboot.ex7.FooServiceImplTest2]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [...]]

比如以下代碼就會(huì)造成這個(gè)問(wèn)題:

@SpringBootApplication(scanBasePackages = "me.chanjar.basic.service")
public class Config1 {
}

@SpringBootApplication(scanBasePackages = "me.chanjar.basic.service")
public class Config2 {
}

@SpringBootTest
public class FooServiceImplTest extends AbstractTestNGSpringContextTests {
  // ...
}

解決這個(gè)問(wèn)題的方法有就是避免自動(dòng)查詢@SpringBootConfiguration

定義@SpringBootTest(classes=...)

提供nested @Configuration class

最佳實(shí)踐

除了單元測(cè)試(不需要初始化ApplicationContext的測(cè)試)外,盡量將測(cè)試配置和生產(chǎn)配置保持一致。比如如果生產(chǎn)配置里啟用了AutoConfiguration,那么測(cè)試配置也應(yīng)該啟用。因?yàn)橹挥羞@樣才能夠在測(cè)試環(huán)境下發(fā)現(xiàn)生產(chǎn)環(huán)境的問(wèn)題,也避免出現(xiàn)一些因?yàn)榕渲貌煌瑢?dǎo)致的奇怪問(wèn)題。

在測(cè)試代碼之間盡量做到配置共用,這么做的優(yōu)點(diǎn)有3個(gè):

能夠有效利用Spring TestContext Framework的緩存機(jī)制,ApplicationContext只會(huì)創(chuàng)建一次,后面的測(cè)試會(huì)直接用已創(chuàng)建的那個(gè),加快測(cè)試代碼運(yùn)行速度。

當(dāng)項(xiàng)目中的Bean很多的時(shí)候,這么做能夠降低測(cè)試代碼復(fù)雜度,想想如果每個(gè)測(cè)試代碼都有一套自己的@Configuration或其變體,那得多嚇人。

參考文檔

Spring Framework Testing

Spring Boot Testing

Spring TestContext Framework

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70260.html

相關(guān)文章

  • Spring、Spring BootTestNG測(cè)試指南 - 測(cè)試Spring MVC

    摘要:地址提供了,能夠很方便的來(lái)測(cè)試。同時(shí)也提供了更進(jìn)一步簡(jiǎn)化了測(cè)試需要的配置工作。本章節(jié)將分別舉例說(shuō)明在不使用和使用下如何對(duì)進(jìn)行測(cè)試。例子測(cè)試的關(guān)鍵是使用對(duì)象,利用它我們能夠在不需啟動(dòng)容器的情況下測(cè)試的行為。 Github地址 Spring Testing Framework提供了Spring MVC Test Framework,能夠很方便的來(lái)測(cè)試Controller。同時(shí)Spring...

    andong777 評(píng)論0 收藏0
  • Spring、Spring BootTestNG測(cè)試指南 - @JsonTest

    摘要:地址是提供的方便測(cè)試序列化反序列化的測(cè)試工具,在的文檔中有一些介紹。例子簡(jiǎn)單例子源代碼見使用通包下的文件測(cè)試結(jié)果是否正確或者使用基于的校驗(yàn)例子測(cè)試可以用來(lái)測(cè)試。這個(gè)例子里使用了自定義的測(cè)試代碼例子使用事實(shí)上也可以配合一起使用。 Github地址 @JsonTest是Spring Boot提供的方便測(cè)試JSON序列化反序列化的測(cè)試工具,在Spring Boot的文檔中有一些介紹。 需要注...

    Hegel_Gu 評(píng)論0 收藏0
  • Spring、Spring BootTestNG測(cè)試指南 - @OverrideAutoConfi

    摘要:因?yàn)橹挥羞@樣才能夠在測(cè)試環(huán)境下發(fā)現(xiàn)生產(chǎn)環(huán)境的問(wèn)題,也避免出現(xiàn)一些因?yàn)榕渲貌煌瑢?dǎo)致的奇怪問(wèn)題。而方法則能夠不改變?cè)信渲貌惶峁┬碌呐渲玫那闆r下,就能夠關(guān)閉。 Github地址 在Chapter 1: 基本用法 - 使用Spring Boot Testing工具里提到: 除了單元測(cè)試(不需要初始化ApplicationContext的測(cè)試)外,盡量將測(cè)試配置和生產(chǎn)配置保持一致。比如如果生產(chǎn)...

    elisa.yang 評(píng)論0 收藏0
  • Spring、Spring BootTestNG測(cè)試指南 - 測(cè)試@Configuration

    Github地址 在Spring引入Java Config機(jī)制之后,我們會(huì)越來(lái)越多的使用@Configuration來(lái)注冊(cè)Bean,并且Spring Boot更廣泛地使用了這一機(jī)制,其提供的大量Auto Configuration大大簡(jiǎn)化了配置工作。那么問(wèn)題來(lái)了,如何確保@Configuration和Auto Configuration按照預(yù)期運(yùn)行呢,是否正確地注冊(cè)了Bean呢?本章舉例測(cè)試@Co...

    _DangJin 評(píng)論0 收藏0
  • Spring、Spring BootTestNG測(cè)試指南 - @TestPropertySourc

    摘要:地址可以用來(lái)覆蓋掉來(lái)自于系統(tǒng)環(huán)境變量系統(tǒng)屬性的屬性。同時(shí)優(yōu)先級(jí)高于。利用它我們可以很方便的在測(cè)試代碼里微調(diào)模擬配置比如修改操作系統(tǒng)目錄分隔符數(shù)據(jù)源等。源代碼例子使用工具也可以和一起使用。源代碼見參考文檔 Github地址 @TestPropertySource可以用來(lái)覆蓋掉來(lái)自于系統(tǒng)環(huán)境變量、Java系統(tǒng)屬性、@PropertySource的屬性。 同時(shí)@TestPropertySou...

    paney129 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<