1. 程式人生 > >Spring-test + Junit4單元測試

Spring-test + Junit4單元測試

編碼 繼承 tco 試用 ont 操作 主鍵 app nbsp

一、僅使用Junit進行單元測試不足之處:

1、導致多次Spring容器初始化問題

   —>根據JUnit測試方法的調用流程,每執行一個測試方法都會創建一個測試用例的實例並調用setUp()方法。由於一般情況下,我們在setUp()方法中初始化Spring容器,這意味著如果測試用例有多少個測試方法,Spring容器就會被重復初始化多次。雖然初始化Spring容器的速度並不會太慢,但由於可能會在Spring容器初始化時執行加載Hibernate映射文件等耗時的操作,如果每執行一個測試方法都必須重復初始化Spring容器,則對測試性能的影響是不容忽視的;

  —>使用Spring測試套件,Spring容器只會初始化一次!

2、需要使用硬編碼方式手工獲取Bean

  —>在測試用例類中我們需要通過ctx.getBean()方法從Spirng容器中獲取需要測試的目標Bean,並且還要進行強制類型轉換的造型操作。這種乏味的操作迷漫在測試用例的代碼中,讓人覺得煩瑣不堪;

  —>使用Spring測試套件,測試用例類中的屬性會被自動填充Spring容器的對應Bean ,無須在手工設置Bean

3、數據庫現場容易遭受破壞

  —>測試方法對數據庫的更改操作會持久化到數據庫中。雖然是針對開發數據庫進行操作,但如果數據操作的影響是持久的,可能會影響到後面的測試行為。舉個例子,用戶在測試方法中插入一條ID為1的User記錄,第一次運行不會有問題,第二次運行時,就會因為主鍵沖突而導致測試用例失敗。所以應該既能夠完成功能邏輯檢查,又能夠在測試完成後恢復現場,不會留下“後遺癥”;

  —>使用Spring測試套件,Spring會在你驗證後,自動回滾對數據庫的操作,保證數據庫的現場不被破壞,因此重復測試不會發生問題!

4、不方便對數據操作正確性進行檢查

  —>假如我們向登錄日誌表插入了一條成功登錄日誌,可是我們卻沒有對t_login_log表中是否確實添加了一條記錄進行檢查。一般情況下,我們可能是打開數據庫,肉眼觀察是否插入了相應的記錄,但這嚴重違背了自動測試的原則。試想在測試包括成千上萬個數據操作行為的程序時,如何用肉眼進行檢查?

  —>只要你繼承Spring的測試套件的用例類,你就可以通過jdbcTemplate在同一事務中訪問數據庫,查詢數據的變化,驗證操作的正確性!

實例代碼:

     <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
     <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.3.5.RELEASE</version>
            <scope>test</scope>
        </dependency>
package com.sgl.dao;

import javax.transaction.Transactional;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@Transactional // 控制事務,也可以加載方法上
@RunWith(SpringJUnit4ClassRunner.class) // 使用junit4進行測試
@ContextConfiguration({ "/spring-context.xml" }) // 加載配置文件,可以加載多個
public class TestUserMapper {
    private static Logger logger = LoggerFactory.getLogger(TestUserMapper.class);

    @Autowired
    private UserMapper userMapper;

    @Rollback(value = false) // 不回滾
    @Test
    public void deleteUserById() {
        int count = userMapper.deleteUserById(2);
        logger.info("成功刪除{}條數據", count);
    }

}

Spring-test + Junit4單元測試