1. 程式人生 > >使用RunWith註解改變JUnit的預設執行類,並實Listener在平時的單元測試

使用RunWith註解改變JUnit的預設執行類,並實Listener在平時的單元測試

[java] view plaincopy
public class TestClass {  
    @Test public void  t1(){}  
}  
JUnit允許使用者指定其它的單元測試執行類,只需要我們的測試執行類繼承類org.junit.runners.BlockJUnit4ClassRunner就可以了,Spring的執行類SpringJUnit4ClassRunner就是繼承了該類。我們平時用Spring也比較多,為了能夠更加方便的引用配置檔案,我們單元測試就使用了Spring實現的執行類。此時的單元測試執行類將會看起來是這樣:
[java] view plaincopy
@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = { "classpath*:/spring1.xml", "classpath*:/spring2.xml" })  
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class })  
@Transactional  
public class TestClass {  
    @Inject  
    //這個類會在執行時被注入,這裡是按型別注入,如果想按名稱注入,需要加上@Named註解,如@Named("class1")  
    //實現類可以加上@Named("class1")註解,也可以是配置在配置檔案中的  
    Class1 class1;  
      
    @Test   
    public void  t1(){}  
}  
以下分別對使用到的幾個註解進行解釋:
@RunWith:這個是指定使用的單元測試執行類,這裡就指定的是SpringJUnit4ClassRunner.class;
@ContextConfiguration:這個指定Spring配置檔案所在的路徑,可以同時指定多個檔案;
@TestExecutionListeners:這個用於指定在測試類執行之前,可以做的一些動作,如這裡的DependencyInjectionTestExecutionListener.class,就可以對一測試類中的依賴進行注入,TransactionalTestExecutionListener.class用於對事務進行管理;這兩個都是Srping自帶的; 我們也可以實現自己的Listener類來完成我們自己的操作,只需要繼續類org.springframework.test.context.support.AbstractTestExecutionListener就可以了,具體可以參照DependencyInjectionTestExecutionListener.class的實現,後面我會貼出例項。 Listener實在實現類執行之前被執行、實現類的測試方法之前被執行,這與Listener的實現有關。
@Transactional:這裡的@Transactional不是必須的,這裡是和@TestExecutionListeners中的TransactionalTestExecutionListener.class配合使用,用於保證插入的資料庫中的測試資料,在測試完後,事務回滾,將插入的資料給刪除掉,保證資料庫的乾淨。如果沒有顯示的指定@Transactional,那麼插入到資料庫中的資料就是真實的插入了。
我們的單元測試,通常涉及到資料庫的操作,那我們就需要真實的從資料庫中讀取資料並進行邏輯處理,為了保證資料庫的乾淨,也為了保證測試資料的準確性與正確性,我們最好是在做測試之前插入我們自己準備的測試資料,然後在測試完成後,將資料刪除掉,這時我們就可以通過增加一個Listener,來準備我們需要的測試資料,並和上面的事務管理相結合,就不會真正的提交到資料庫中去了。
以下這個例項是一個簡單的Listener實現,只是功能是把我們配置在method上面的註解裡面的配置檔案路徑給打印出來,因為實現整合DBUnit並插入資料庫的程式碼比較多,這裡我就不貼出來了。1.首先我們需要準備一個註解,用來標識其帶的引數為測試準備的資料檔案:DBUnitTestData.java
[java] view plaincopy
@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.METHOD)  
@Inherited  
@Documented  
public @interface DBUnitTestData {  
  
    public String[] dataSetLocations();  
}  
2.編寫Listener,這個Listener的名字就定義為DBUnitTestExecutionListener.class:DBUnitTestExecutionListener.java
[java] view plaincopy
import org.springframework.test.context.TestContext;  
import org.springframework.test.context.TestExecutionListener;  
  
public class DBUnitTestExecutionListener implements TestExecutionListener {  
  
    public void prepareTestInstance(TestContext testContext) throws Exception {  
    }  
  
    public void beforeTestClass(TestContext testContext) throws Exception {  
        // Nothing to do  
    }  
  
    public void afterTestClass(TestContext testContext) throws Exception {  
        // Nothing to do  
    }  
  
    public void beforeTestMethod(TestContext testContext) throws Exception {  
        DBUnitTestData dbUnitRefresh = testContext.getTestMethod().getAnnotation(DBUnitTestData.class);  
        if (dbUnitRefresh == null) {  
            return;  
        }  
        String[] dataSetLocations = dbUnitRefresh.dataSetLocations();  
        loadTestData(testContext, dataSetLocations);  
    }  
  
    public void afterTestMethod(TestContext testContext) throws Exception {  
        // Nothing to do  
    }  
  
    private void loadTestData(TestContext testContext, String[] dataSetLocations) {  
        if (dataSetLocations == null || dataSetLocations.length == 0) {  
            return;  
        }  
        for (String dataSetLocation : dataSetLocations) {  
            //Do what you want to do with the data set files  
            System.out.println(dataSetLocation);  
        }  
    }  
  
}  
3.將Listener實現類加入到測試類的@TestExecutionListeners裡面,在方法上面增加註解@DBUnitTestData,這個時候測試類將會是如下這樣:
[java] view plaincopy
@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = { "classpath*:/spring1.xml", "classpath*:/spring2.xml" })  
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class,DBUnitTestExecutionListener.class })  
@Transactional  
public class TestClass {  
    @Inject  
    //這個類會在執行時被注入,這裡是按型別注入,如果想按名稱注入,需要加上@Named註解,如@Named("class1")  
    //實現類可以加上@Named("class1")註解,也可以是配置在配置檔案中的  
    Class1 class1;  
      
    @Test   
    @DBUnitTestData(dataSetLocations={"classpath:/testData/testData1.xml","classpath:/testData/testData2.xml"})  
    public void  t1(){}  
}  
4.執行這個方法就可以看到@DBUnitTestData註解的資料檔案路徑給打印出來了。

相關推薦

使用RunWith註解改變JUnit預設執行Listener平時單元測試

[java] view plaincopy public class TestClass {       @Test public void  t1(){}   }   JUnit允許使用者指定其它的單元測試執行類,只需要我們的測試執行類繼承類org.junit.runne

使用RunWith註解改變JUnit預設執行實現自已的Listener

  zh 使用RunWith註解改變JUnit的預設執行類,並實現自已的Listener在平時的單元測試,如果不使用RunWith註解,那麼JUnit將會採用預設的執行類Suite執行,如下類: [java] view plain copy pub

eclipse專案中當使用註解時找不到

今天遇到一個奇怪的問題,在pom.xml 中匯入下面的jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s

執行緒實現方式1:自定義一個繼承Thread重寫run方法。

/** * 多執行緒實現方式1: * 自定義一個類,繼承Thread類,並重寫run方法。 * 執行緒同時執行。 * @author jiaxutianhuo * */ public cl

通過python socket遠程執行命令返回值

python socket #!/usr/bin/env python# TCP-Serverimport socketimport subprocesssk_obj = socket.socket(socket.AF_INET,socket.SOCK_STREAM)sk_obj.bind((‘12

expect實現自動scp和ssh登錄後執行命令向bash提供返回值

ip地址 用戶名 expect 密碼 #!/bin/bash # 全局變量:用戶名,普通用戶密碼,root密碼 loginname="xxxx" userpwd="xxxx" rootpwd="xxxx" # 讀取iplist(逐行存儲IP地址) cat /root/iplist | whi

C#反射 字符串轉為實體做為參數傳入泛型方法中使用

subst type xxd main.c 發現 get director col asm 工作中有這樣一個需求,有N張不同的報表,每張報表對應一個數據源,以前采用SQL統計方式 ,統計數據采用內存方式,首先在內在裏定義了數據源對應實體。統計條件用lamdba表達式式實現,

定義一個Father和Child進行測試

1. 題目描述 定義一個Father和Child類,並進行測試. 要求如下:  1)Father類為外部類,類中定義一個私有的String型別的屬性name,name的值為“zhangjun”。  2)Child類為Father類的內部類,其中定義一個introFather()方法,方法

在 docker 中執行 jupyter在本機上開啟網頁

在 docker 中執行 jupyter,並在本機上開啟網頁 docker run docker run -it -p 7000:7000 --rm --name test docker_image_id docker 啟動 jupyter noteboo

根據字串的形式自動匯入模組使用反射找到模組中的例項化物件利用importlib和getattr實現的

例如: auth資料夾下一個SCRF.py檔案,裡面有一個Cors類 class CORS(object): def process_request(self): print('666') auth資料

獲取實現了某介面的所有返回該類中自定義的方法的方法名

準備階段:   定義介面和實現介面的類。 interface IMyInterface { void Write(); } /// <summary> /// 實現類1 /// </summary>

在Spark SQL對人類資料實現K-Means聚對聚中心格式化輸出

簡介 本篇博文對UCI提供的 Machine-Learning-Databases 資料集進行資料分析,並通過K-Means模型實現聚類,最後格式化輸出聚類中心點。 本文主要包括以下內容: 通過VectorAssembler來將多列資料合成一列features

sublime 執行python在python2和3之間切換。

當系統有多個python版本時候,可在sublime中設定和選擇使用哪個版本。 例如,我的系統預設python版本為2.7的,想要切換為3,具體操作如下: 在sublime上方tools–>build system–>new build system,彈出

docker 使用centos 映象 執行 javaweb 重新生成映象

Docker 是 2014 年最為火爆的技術之一,幾乎所有的程式設計師都聽說過它。Docker 是一種“輕量級”容器技術,它幾乎動搖了傳統虛擬化技術的地位,現在國內外已經有越來越多的公司開始逐步使用 Docker 來替換現有的虛擬化平臺了。作為一名 Java 程式設計師,我們是時候一起把 Docker

定義點以點為基派生出直線從基中繼承的點的資訊表示直線的中點。

#include<iostream> #include<cmath> using namespace std; class Point //定義座標點類 { public: //定義必要的建構函式 Point(double a=0,d

2015C++第二週任務九:定義一個person派生student在派生teacher派生當老師的學生。

任務九:定義一個person類,派生student類,在派生teacher類,並派生當老師的學生。 #include "stdafx.h" #include <stdio.h> #include<iostream> #include<str

C#列印預覽時更改預設邊距設定預設的寬高

 new PrinterMargins(20,20,20,20,787,1129)   //此步最好在初始化,document 的時候就設定好邊距,否則後面邊距設定後,還有一些預設的X1,Y1非設定的值不會變化,會是預設的100,影響了列印時整個座標的結果。  

shell 迴圈列印日期(可指定起始日期或預設日期)返回天數

#!/bin/bash start_date=$1; end_date=$2;   ##判斷變數,是否為空(如果沒有或只有一個,進行預設賦值)   if [ "$1" == "" ]    then       start_date=`date -d "today last

java反射載入轉化為DataFrame

動態載入類,構造類的例項,並轉化為DataFrame,同時還要解決入表時,類屬性值與表字段一一對應,同時只有部分欄位有值,其他欄位提供根據欄位型別提供預設值 def mergeRDD(spark:S