摘要:三使用介紹通過代碼創(chuàng)建通過注解四常用方法驗證方法沒有被調用驗證方法被調用了次方法至少被調用次方法最多被調用次備注假如你無法給你程序寫單元測試,那么意味著你的程序結構有問題,需要調整或重構。
Java單元測試入門
什么是單元測試
定義:單元測試是對軟件或程序的基本(最小)組成單元的測試
對象:方法、類
特點:
為什么要寫單元測試
需不需要寫單元測試
只要程序能運行就可以了,寫單元測試浪費時間
代碼很簡單不需要單元測試
我保證不會有什么問題的
測試人員測試一下就可以了
這次沒有時間寫了,下次補上吧
測試分類
單元測試->集成測試->端到端測試
各測試占比
Junit例子
import org.junit.*; import static org.junit.Assert.fail; public class ClassNameTest { @BeforeClass //公開表態(tài)無返回值 public static void beforeClass() throws Exception{ //每次測試類執(zhí)行前執(zhí)行一次,主要用來初使化公共資源等 } @AfterClass //公開表態(tài)無返回值 public static void afterClass() throws Exception{ //每次測試類執(zhí)行完成后執(zhí)行一次,主要用來釋放資源或清理工作 } @Before public void setup() throws Exception { //每個測試案例執(zhí)行前都會執(zhí)行一次 } @After public void teardown() throws Exception { //每個測試案例執(zhí)行完成后都會執(zhí)行一次 } @Test public void testMethodName_give_…_when_…_then_…() { fail("失敗"); } }
常用注解
@Ignore 該注解標記的測試方法在測試中會被忽略 @Test @Test(expected=xxxException.class) 斷言該方法會拋出異常 @Test(timeout=1000) 執(zhí)行時間超過設置的值該案例會失敗 @RunWith @RunWith(Suite.class) 測試集運行器配合使用測試集功能 @RunWith(JUnit4.class) 默認運行器 @RunWith(Parameterized.class) 參數(shù)化運行器 @RunWith(Suite.class) @Suite.SuiteClasses({ CalculatorTest.class,SquareTest.class}) @Rule public class ExpectedExceptionsTest { @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void verifiesTypeAndMessage() { thrown.expect(RuntimeException.class); thrown.expectMessage("Runtime exception occurred"); throw new RuntimeException("Runtime exception occurred"); } }
參數(shù)化
@RunWith(Parameterized.class) public class PrimeFactorTest { private PrimeFactor primeFactor; private int input; private Listexpected; //構造函數(shù) public PrimeFactorTest(int input, List expected) { this.input = input; this.expected = expected; } @Parameterized.Parameters public static Collection init() { return Arrays.asList(new Object[][]{ {18, Arrays.asList(2, 3, 3)} }); } @Test public void testFactor_when_input_18_then_must_return_2_3_3() { Assert.assertEquals(expected, primeFactor.factor(input)); } }
斷言
常用的斷言方法如下: assertEquals(a, b) 測試a是否等于b(a和b是原始類型數(shù)值(primitive value)或者必須為實現(xiàn)比較而具有equal方法) assertFalse(a) 測試a是否為false(假),a是一個Boolean數(shù)值。 assertTrue(a)??????? 測試a是否為true(真),a是一個Boolean數(shù)值 assertNotNull(a) 測試a是否非空,a是一個對象或者null。 assertNull(a) 測試a是否為null,a是一個對象或者null。 assertNotSame(a, b) 測試a和b是否沒有都引用同一個對象。 assertSame(a, b)?? 測試a和b是否都引用同一個對象。 fail(string)? Fail讓測試失敗,并給出指定信息。 assertThat(expected, Matcher) 通過Matcher斷言 Hamcrest :greaterThan,greaterThanOrEqualTo,lessThan,anything,anyOf,containsString
建議
使用give when then方式命名你的測試方法名稱。
一個案例只寫一個斷言。
要寫注釋,建議分為如下4步驟。
測試場景
準備數(shù)據(jù)
測試執(zhí)行
斷言
Mock介紹一、mock就是在測試過程中,對于某些不容易構造或者不容易獲取的對象,用一個虛擬的對象來創(chuàng)建以便測試的測試方法,這個虛擬的對象就是mock對象。mock對象就是真實對象在調試期間的代替品。
Java常用Mock
EasyMock、JMock、PowerMock、Mockit等
二、Mock工具的原理
?mock工具工作的原理大都如下:
record階段:錄制期望。也可以理解為數(shù)據(jù)準備階段。創(chuàng)建依賴的class 或interface或method ,模擬返回的數(shù)據(jù),及調用的次數(shù)等。
replay階段:通過調用被測代碼,執(zhí)行測試。期間會invoke 到 第一階段record的mock對象或方法。
verify階段:驗證。可以驗證調用返回是否正確。及mock的方法調用次數(shù),順序等。
三、Mockito使用介紹
通過代碼創(chuàng)建 1. public?class?UserServiceTest?{?? 2. ????private?UserService?userService;?? 3. ????private?UserDao?mockUserDao;?? 4. ????@Before?? 5. ????public?void?setUp()?{ 6. ????????mockUserDao?=?mock(UserDao.class);?? 7. ????????userService?=?new?UserServiceImpl();?? 8. ????????userService.setUserDao(mockUserDao);?? 9. ????} 通過注解 1. public?class?UserServiceTest?{?? 2. ? 3. ????@InjectMocks 4. ????private?UserServiceImpl?userService;?? 5. ?? 6. ????@Mock?? 7. ????private?UserDao?mockUserDao;?? 8. ?? 9. ????@Before?? 10. ????public?void?setUp()?{?? 11. ????????MockitoAnnotations.initMocks(this);?? 12. ????}
四、Mockito常用方法
verify verify(mock,?never()).add("twice");? 驗證add方法沒有被調用 verify(mock,?times(2)).add("twice");? 驗證add方法被調用了2次 verify(mock, atLeast(n)).someMethod(); 方法至少被調用n次 verify(mock, atMost(n)).someMethod(); 方法最多被調用n次 when when(mock.someMethod()).thenReturn(value1).thenReturn(value2); when(mock.get(0)).thenReturn("first");? when(mock.get(1)).thenThrow(new?RuntimeException()); when(mock.get(anyInt())).thenReturn("element");? spy List?spy?=?spy(new?LinkedList()); when(spy.get(0)).thenReturn(“foo"); doReturn("foo").when(spy).get(0);備注
假如你無法給你程序寫單元測試,那么意味著你的程序結構有問題,需要調整或重構。對待測試代碼要向生產(chǎn)代碼一樣,測試代碼也需要重構和維護。
3Q
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71415.html
摘要:添加依賴新建項目選擇三個依賴對于已存在的項目可以在加入,將會幫你自動配置好配置基本信息然后在下添加基本配置數(shù)據(jù)庫連接地址數(shù)據(jù)庫賬號數(shù)據(jù)庫密碼數(shù)據(jù)庫驅動創(chuàng)建實體創(chuàng)建一個實體,包含姓名年齡屬性創(chuàng)建數(shù)據(jù)訪問接口創(chuàng)建一個 添加依賴 新建項目選擇web,MyBatis,MySQL三個依賴 showImg(https://segmentfault.com/img/bV2l1L?w=1684&h=1...
摘要:編寫一個接口創(chuàng)建命名為根據(jù)實際情況修改創(chuàng)建類,內容如下啟動主程序,使用等工具發(fā)起請求,可以看到頁面返回編寫單元測試用例打開的下的測試入口類。 簡介 在您第1次接觸和學習Spring框架的時候,是否因為其繁雜的配置而退卻了?在你第n次使用Spring框架的時候,是否覺得一堆反復黏貼的配置有一些厭煩?那么您就不妨來試試使用Spring Boot來讓你更易上手,更簡單快捷地構建Spring應...
摘要:言歸正傳,上一篇文章單元測試如何開始介紹了幾款單元測試框架基本用法依賴隔離概念,本篇主要解答單元測試中幾個重要問題。在單元測試交流微信群,很多新進來的小伙伴,都會幾個大同小異的問題。 showImg(/img/bVEpaD?w=1080&h=715); 原文鏈接:http://www.jianshu.com/p/f5d197a4d83a 前言 已經(jīng)一個月沒寫文章了,由于9月份在plan...
閱讀 1993·2021-11-24 10:45
閱讀 1850·2021-10-09 09:43
閱讀 1291·2021-09-22 15:38
閱讀 1219·2021-08-18 10:19
閱讀 2837·2019-08-30 15:55
閱讀 3057·2019-08-30 12:45
閱讀 2961·2019-08-30 11:25
閱讀 356·2019-08-29 11:30