Java單元測試總結


  單元測試的重要性這里就不說了,直接進入正題。很多程序員不喜歡寫單元測試,導致項目經常會花很多時間去debug,這完全得不償失。對關鍵方法進行單元測試,可以在早期業務邏輯還沒那么復雜的時候,盡快排除症結。

  在dao,manager,server,web這樣的分層項目中,通常單元測試是要寫在server層的,因為server層可以測的最多。本文中不介紹單元測試的原理,只是介紹單元測試最常用的斷言和Jmockit的用法,可以應付業務開發中絕大部分單元測試。

首先添加maven依賴

 1 <dependencie>
 2     <dependency>
 3          <groupId>junit</groupId>
 4          <artifactId>junit</artifactId>
 5          <version>4.10</version>
 6          <scope>test</scope>
 7      </dependency>
 8      <dependency>
 9          <groupId>org.springframework</groupId>
10          <artifactId>spring-test</artifactId>
11          <version>3.2.9.RELEASE</version>
12          <scope>test</scope>
13      </dependency>
14      <dependency>
15          <groupId>org.jmockit</groupId>
16          <artifactId>jmockit</artifactId>
17          <version>1.24</version>
18          <scope>test</scope>
19      </dependency>
20      <dependency>
21          <groupId>org.mockito</groupId>
22          <artifactId>mockito-all</artifactId>
23          <version>1.8.4</version>
24          <scope>test</scope>
25      </dependency>
26 </dependencie>

1、BaseTest.java

server層新建test包,在IDEA中標記為綠色,這個里面寫Before和After,如果不需要,就空在這里即可。其它具體的測試類要繼承BaseTest.java。

這里寫圖片描述

 1 package com.sf.sfpp.notice.test;
 2 
 3 import org.junit.After;
 4 import org.junit.Before;
 5 import org.junit.runner.RunWith;
 6 import org.springframework.test.context.ContextConfiguration;
 7 import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
 8 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 9 
10 @RunWith(SpringJUnit4ClassRunner.class)
11 @ContextConfiguration(locations = { "/test-service.xml" })
12 public class BaseTest  extends AbstractTransactionalJUnit4SpringContextTests {
13     @Before
14     public void init(){
15     }
16     @After
17     public void print(){
18     }
19 }

2、assert斷言

  使用assert斷言是常用的單元測試方法之一。其本質是將方法的返回結果與預期值進行比較,相等則結果為綠色(單元測試通過),反之為紅色(單元測試未通過)。

比方說,我們在Manager層有一個類,UserHistoryManager,里面有個方法是根據ID刪除用戶操作歷史

1 @Autowired
2 private UserHistoryMapper userHistoryMapper;
3 
4 public int deleteUserHistoryById(int userHistoryId){
5     return userHistoryMapper.deleteUserHistoryById(userHistoryId);
6 }

 

現在想要對這個方法進行單元測試,在server層的test下面的impl文件夾中新建一個TestUserHistoryManager類,依舊如第一張圖所示,代碼如下:

 1 package com.sf.sfpp.notice.test.impl;
 2 
 3 import com.sf.sfpp.notice.common.domain.UserHistory;
 4 import com.sf.sfpp.notice.manager.UserHistoryManager;
 5 import com.sf.sfpp.notice.test.BaseTest;
 6 import org.junit.Test;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 
 9 public class TestUserHistoryManager extends BaseTest {
10     @Autowired
11     private UserHistoryManager userHistoryManager;
12 
13     @Test
14     public void testDeleteUserHistoryById(){
15         Assert.assertEquals(true,userHistoryManager.deleteUserHistoryById(4) > 0);
16     }
17 }

 

3、Jmockit

  有些方法要遠遠比上面的assert復雜,例如當你的方法中要添加一個對象到數據庫中,此時如何進行單元測試呢?

還是如第一張圖片所示,在test下面的impl文件夾中新建TestUserNotificationManager.java,測試一下UserHistoryManager中添加用戶歷史的方法。

 1 package com.sf.sfpp.notice.test.impl;
 2 
 3 import com.sf.sfpp.notice.common.domain.UserHistory;
 4 import com.sf.sfpp.notice.manager.UserHistoryManager;
 5 import com.sf.sfpp.notice.test.BaseTest;
 6 import org.junit.Assert;
 7 import org.junit.Test;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 
10 import static org.mockito.Mockito.mock;
11 import static org.mockito.Mockito.when;
12 
13 public class TestUserNotificationManager extends BaseTest {
14     @Autowired
15     private UserHistoryManager userHistoryManager;
16 
17     @Test
18     public void testAddUserHistory(){
19         UserHistory userHistory = mock(UserHistory.class);
20         when(userHistory.getAction()).thenReturn("balabala");
21         when(userHistory.getTargetId()).thenReturn("balabala");
22         when(userHistory.getUserId()).thenReturn(43);
23         when(userHistory.getTargetKind()).thenReturn("balabala");
24         when(userHistory.getId()).thenReturn("balabala");
25         Assert.assertTrue(userHistoryManager.addUserHistory(balabala));
26     }
27 
28 }

 

  上面的方法相當於用Jmockit虛擬了一個UserHistory對象(用戶操作歷史),然后根據其中的每個屬性看返回值(字符串屬性對應字符串返回值,int屬性對應int返回值)。

在IDEA中點擊方法名前面的綠色箭頭(ctrl+shift+F10)

單元測試只要看到下面的綠色條,就表示測試通過了。 
這里寫圖片描述

 

 


轉載自:
http://blog.csdn.net/antony9118/article/details/54312710


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM