Java的單元測試和整合spring單元測試
在我們編寫專案過程中,經常會需要進行程式碼測試,那是不是在編寫一個main方法之後,然後編寫各種的測試程式碼。這樣做,顯然是不合適的也是很不專業的。那怎麼辦呢?今天我們來聊下junit(單元測試)。
為了後期測試基於spring的單元測試,我們直接新建spring工程。
新建之後,我們先講一般在java專案中怎麼去做單元測試。
我們先定義一個實體User
在service包中新建一個介面,在介面中定義一個方法,方法的返回值就是返回一個使用者物件
有有了介面,對應這我們去編寫它的實現類
這裡面就是一個簡單的業務邏輯,如果id為1則返回一個User物件,否則返回一個空值。在真實的專案中,這邊肯定不是這麼簡單的業務,它對應著的肯定是呼叫持久層相關的方法,進行業務邏輯的實現。我們這邊只是為了講解單元測試,所以例子相對簡單。
service實現已經寫好,那我們下步做的事情就是對它進行單元測試。
首先,新建測試類
我們這邊新建跟src一樣型別的原始檔,名字取為test。為什麼這麼做?也就是這樣做的好處是什麼?1.層次清晰,專案程式碼跟測試程式碼分開,條目很清晰。2.方便管理。
新建好test源包之後,我們再來新建測試類。怎麼新建呢?滑鼠右擊你要測試的類,點選new按鈕,再點選右側的other,在搜尋框中輸入junit。選擇Junit Test Case,點選next,出現如下介面
點選Browse按鈕選擇,我們新建的test源目錄,勾選junit4
點選next,它會自動掃描你測試類中所有的方法。
選中你想測試的方法,點選finish。
由此我們的單元測試新建就基本完成了。
注意:我們這邊引用的是junit4,那有些小夥伴加的junit3。那他們的區別是什麼呢?junit3需要繼承TestCase這個類,而我們junit4不需要。
import static org.junit.Assert.*; 斷言(不詳解,可百度)
基本註解
@Test:將一個普通的方法修飾成為一個測試方法,可以接受異常
@Test(expected=XX.class) 接受異常
@Test(timeout=毫秒) 定時結束
@BeforClass:它會在所有的方法執行前被執行,只執行一次,static修飾,用來載入配置檔案
@AfterClass:它會在所有的方法執行結束後被執行,static修飾,用來釋放資源
@Before:會在每一個測試方法被執行前執行一次
@After:會在每一個測試方法執行後被執行
@Ignore:所修飾的方法會被測試執行器忽略
@RunWith:可以更改測試執行器 只要你的測試器繼承org.junit.runner.Runner
演示如下:
右擊執行選擇Junit Test
顯示結果:
那下面我們來結合案例來測試下我們的簡單Servcie
雙擊我們要測試的方法名,右擊執行Junit Test,首先測試面板不報錯。綠色代表程式無錯。紅色代表程式出錯,根據出錯資訊,查詢錯誤所在地,然後進行修改。
左邊的Runs:1/1 表示你運行了幾個Test測試方法。 Errors:0 表示有多少個錯誤。Failures:0 表示使用斷言的時候,為期望我達到的值的方法有幾個。
控制檯列印結果
至此我們普通的單元測試基本用法已經講完。
那基於spring的單元測試怎麼弄呢?(這邊講解是針對有spring基礎的人群)
首先載入spring的jar包
spring-test-4.0.4.RELEASE(注意版本)
commons-logging-1.2.jar
在applicationContext.xml中,掃描service實現包
<context:component-scan base-package="service.impl"></context:component-scan>
在UserServiceImpl實現類上使用springmvc 註解@Service("userService")
編寫spring單元測試,點選執行。
@RunWith(SpringJUnit4ClassRunner.class) 上面已做介紹。
@ContextConfiguration(locations={"classpath:applicationContext.xml"})載入配置檔案,locations引數是一個數組,可以載入多個,配置檔案。
@Resource 自動注入Ioc容器的對應的bean。
@Test 我們的測試方法。
junit的套件測試:
當我們新建了大量的測試類,我們不可能當程式出現問的時候,再一個一個的開啟類然後點選一個一個的方法吧。那這邊就可以用到junit的套件測試。
在我們的測試包中,點選右擊新建Junit Test Suit,選擇我們所有的測試類,點選finish
點選執行即可,就達到我們一次測試所有測試類的目的了。
當然,junit 還有很多強大的功能,比如多引數測試等等。。。希望各位小夥伴能夠愉快的玩耍,此次講解只是最基礎的用法。大神繞過。。。
但是,我們junit也不是萬能的,使用junit進行單元測試,只是證明了你的程式無錯,並沒有證明你的程式就是對的。