JAVA 單元測試總結


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

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

首先添加maven依賴

<dependencie>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.9.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.24</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.4</version>
<scope>test</scope>
</dependency>
</dependencie>

1 BaseTest.java

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

這里寫圖片描述

package com.sf.sfpp.notice.test;

import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/test-service.xml" })
public class BaseTest extends AbstractTransactionalJUnit4SpringContextTests {
@Before
public void init(){
}
@After
public void print(){
}
}

2 assert斷言

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

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

@Autowired
private UserHistoryMapper userHistoryMapper;

public int deleteUserHistoryById(int userHistoryId){
return userHistoryMapper.deleteUserHistoryById(userHistoryId);
}

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

package com.sf.sfpp.notice.test.impl;

import com.sf.sfpp.notice.common.domain.UserHistory;
import com.sf.sfpp.notice.manager.UserHistoryManager;
import com.sf.sfpp.notice.test.BaseTest;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

public class TestUserHistoryManager extends BaseTest {
@Autowired
private UserHistoryManager userHistoryManager;

@Test
public void testDeleteUserHistoryById(){
Assert.assertEquals(true,userHistoryManager.deleteUserHistoryById(4) > 0);
}
}

3 Jmockit

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

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

package com.sf.sfpp.notice.test.impl;

import com.sf.sfpp.notice.common.domain.UserHistory;
import com.sf.sfpp.notice.manager.UserHistoryManager;
import com.sf.sfpp.notice.test.BaseTest;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class TestUserNotificationManager extends BaseTest {
@Autowired
private UserHistoryManager userHistoryManager;

@Test
public void testAddUserHistory(){
UserHistory userHistory = mock(UserHistory.class);
when(userHistory.getAction()).thenReturn("balabala");
when(userHistory.getTargetId()).thenReturn("balabala");
when(userHistory.getUserId()).thenReturn(43);
when(userHistory.getTargetKind()).thenReturn("balabala");
when(userHistory.getId()).thenReturn("balabala");
Assert.assertTrue(userHistoryManager.addUserHistory(balabala));
}

}

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

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

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

說明
如有轉載,請務必注明出處
http://blog.csdn.net/antony9118/article/details/54312710


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com