讀古今文學網 > Spring Boot實戰 > 4.1 集成測試自動配置 >

4.1 集成測試自動配置

Spring Framework的核心工作是將所有組件編織在一起,構成一個應用程序。整個過程就是讀取配置說明(可以是XML、基於Java的配置、基於Groovy的配置或其他類型的配置),在應用程序上下文裡初始化Bean,將Bean注入依賴它們的其他Bean中。

對Spring應用程序進行集成測試時,讓Spring遵照生產環境來組裝測試目標Bean是非常重要的一點。當然,你也可以手動初始化組件,並將它們注入其他組件,但對那些大型應用程序來說,這是項費時費力的工作。而且,Spring提供了額外的輔助功能,比如組件掃瞄、自動織入和聲明性切面(緩存、事務和安全,等等)。你要把這些活都干了,基本也就是把Spring再造了一次,最好還是讓Spring替你把重活都做了吧,哪怕是在集成測試裡。

Spring自1.1.1版就向集成測試提供了極佳的支持。自Spring 2.5開始,集成測試支持的形式就變成了SpringJUnit4ClassRunner。這是一個JUnit類運行器,會為JUnit測試加載Spring應用程序上下文,並為測試類自動織入所需的Bean。

舉例來說,看一下代碼清單4-1,這是一個非常基本的Spring集成測試。

代碼清單4-1 用SpringJUnit4ClassRunner對Spring應用程序進行集成測試

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
      classes=AddressBookConfiguration.class)    ←---加載應用程序上下文
public class AddressServiceTests {

  @Autowired
  private AddressService addressService;     ←---注入地址服務

  @Test

  public void testService {             ←---測試地址服務
    Address address = addressService.findByLastName("Sheman");
    assertEquals("P", address.getFirstName);
    assertEquals("Sherman", address.getLastName);
    assertEquals("42 Wallaby Way", address.getAddressLine1);
    assertEquals("Sydney", address.getCity);
    assertEquals("New South Wales", address.getState);
    assertEquals("2000", address.getPostCode);
  }

}

  

如你所見,AddressServiceTests上加注了@RunWith@ContextConfiguration註解。@RunWith的參數是SpringJUnit4ClassRunner.class,開啟了Spring集成測試支持。1與此同時,@ContextConfiguration指定了如何加載應用程序上下文。此處我們讓它加載AddressBookConfiguration裡配置的Spring應用程序上下文。

1在Spring 4.2里,你可以選擇基於規則的SpringClassRuleSpringMethodRule來代替SpringJUnit4ClassRunner

除了加載應用程序上下文,SpringJUnit4ClassRunner還能通過自動織入從應用程序上下文裡向測試本身注入Bean。因為這是一個針對AddressService Bean的測試,所以需要將它注入測試。最後,testService方法調用地址服務並驗證了結果。

雖然@ContextConfiguration在加載Spring應用程序上下文的過程中做了很多事情,但它沒能加載完整的Spring Boot。Spring Boot應用程序最終是由SpringApplication加載的。它可以顯式加載(如代碼清單2-1所示),在這裡也可以使用SpringBootServletInitializer(我們會在第8章裡看到具體做法)。SpringApplication不僅加載應用程序上下文,還會開啟日誌、加載外部屬性(application.properties或application.yml),以及其他Spring Boot特性。用@ContextConfiguration則得不到這些特性。

要在集成測試裡獲得這些特性,可以把@ContextConfiguration替換為Spring Boot的@SpringApplicationConfiguration

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(
      classes=AddressBookConfiguration.class)
public class AddressServiceTests {
  ...
}

  

@SpringApplicationConfiguration的用法和@ContextConfiguration大致相同,但也有不同的地方,@SpringApplicationConfiguration加載Spring應用程序上下文的方式同SpringApplication相同,處理方式和生產應用程序中的情況相同。這包括加載外部屬性和Spring Boot日誌。

我們有充分的理由說,在大多數情況下,為Spring Boot應用程序編寫測試時應該用@SpringApplicationConfiguration代替@ContextConfiguration。在本章中,我們當然也會用@SpringApplicationConfiguration來為Spring Boot應用程序(包括那些面向前端的應用程序)編寫測試。

說到Web測試,這正是我們接下來要做的。