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里,你可以選擇基於規則的SpringClassRule
和SpringMethodRule
來代替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測試,這正是我們接下來要做的。