Spring框架是無侵入性的,所以你的程式碼可以完全是POJO(plain old java object),直接使用Junit就可以完成大部分的單元測試。但是在整合測試方面就比較吃力了。單元測試層面你可以mock一些依賴物件,但是整合測試時需要真實的依賴物件,而這些物件都是在Spring容器的控制之下。那麼如何在引入了Spring的情況下進行整合測試那?彆著急,Spring框架早為我們想到了這點,本身提供了整合測試的功能。
就拿上一次那個簡單的例子來做實驗吧。
首先引入對junit以及spring-test庫的依賴。
pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
<dependencies>
<dependency>
<groupId> junit</groupId>
<artifactId> junit</artifactId>
<version> 4.11</version>
<scope> test</scope>
</dependency>
<dependency>
<groupId> org.springframework</groupId>
<artifactId> spring-test</artifactId>
<version> 4.0.2.RELEASE</version>
</dependency>
</dependencies>
spring-test模組是專門為使用了spring框架的專案進行整合測試的輔助類庫。其有以下幾個目的。
然後新建一個ApplicationTest.java類,程式碼如下所示。
ApplicationTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package huangbowen . net ;
import huangbowen.net.service.Cinema ;
import org.junit.Test ;
import org.junit.runner.RunWith ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.context.ApplicationContext ;
import org.springframework.test.context.ContextConfiguration ;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner ;
import static org . junit . Assert . assertNotNull ;
@RunWith ( SpringJUnit4ClassRunner . class )
@ContextConfiguration ( classes = { Application . class })
public class ApplicationTest {
@Autowired
private ApplicationContext applicationContext ;
@Autowired
private Cinema cinema ;
@Test
public void shouldGetCinemaInstance () {
Cinema cinema = applicationContext . getBean ( Cinema . class );
assertNotNull ( cinema );
}
@Test
public void shouldGetAutowiredCinema () {
assertNotNull ( cinema );
}
@Test
public void shouldGetMovieServiceInstance () {
assertNotNull ( cinema . getMovieService ());
assertThat ( cinema . getMovieService (), instanceOf ( DefaultMovieService . class ));
}
}
在本例中ApplicationTest有兩個註解。@RunWith(SpringJUnit4ClassRunner.class).是Spring TestContext 框架提供的一個自定義的JUnit runner,這樣在測試類中就可以獲取ApplicationContext,甚至直接進行依賴注入,使用事務控制測試方法執行等。宣告瞭@RunWith(SpringJUnit4ClassRunner.class)以後一般還要宣告@ContextConfiguration註解。這個註解是用於告訴測試類本專案中的Spring配置。這裡我們傳入Application.class類,因為這個類中配置了Spring的bean。
然後就可以在測試類中使用強大的@Autowired功能了。我們寫了三個測試方法,第一個是通過Autowired功能拿到ApplicationContext,第二個是通過Autowired功能直接拿到cinema,第三個則是驗證Cinema中的MovieService是被正確注入了的。
Ok,今天就到這裡。本例中的原始碼請在我的GitHub 上自行下載。