Spring-Context之二:使用Spring提供的測試框架進行測試

黃博文發表於2014-03-11

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框架的專案進行整合測試的輔助類庫。其有以下幾個目的。

  • 提供在執行測試時對Spring IOC容器的快取,提高整合測試速度。

  • 對測試例項提供依賴注入功能。

  • 整合測試中提供事務管理。

  • 提供一些輔助類庫幫助開發者更好的編寫整合測試。

然後新建一個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上自行下載。

相關文章