在單元測試中使用EasyMock
我們每天的開發中都要編寫大量的單元測試,很多單元測試的物件是相對獨立的,例如一個所得稅計算的模組,但是更多的單元測試需要依賴其他的元件或者服務。因此,我們需要EasyMock來無縫的連線這些元件。Mock的意思就是空的,不存在的東西。
EasyMock剛剛釋出了2.2版本,它開始使用很多基於jdk 1.5的特性。
下面我們舉一個例子:
假設定義一個如下的介面:
public interface ISimpsonService {
IEpisode getEpisode(int number);
}
public interface IEpisode {
int getNumber();
String getTitle();
InputStream getDataAsStream();
}
該介面的實現為
public class ClientSimpsonService implements ISimpsonService { private ISimpsonService remoteSimpsonService; public ClientSimpsonService(ISimpsonService remoteSimpsonService) { this.remoteSimpsonService = remoteSimpsonService; } public IEpisode getEpisode(int episodeNumber) { return null; }}
對該服務的單元測試如下
public class ClientSimpsonServiceTest extends TestCase { public void testClientSimpsonService() { try { new ClientSimpsonService(null); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // expected } }
我們可以看到因為沒有remoteSimpsonService,所以我們只傳一個null給ClientSimpsonService,
這樣是無法完成測試的。所以我們把還沒有寫的remoteSimpsonService用mock替代。
import static org.easymock.EasyMock.createMock;import junit.framework.TestCase;public class ClientSimpsonServiceTest extends TestCase { private ISimpsonService remoteSimpsonServiceMock; protected void setUp() throws Exception { super.setUp(); remoteSimpsonServiceMock = createMock(ISimpsonService.class); } public void testClientSimpsonService() { try { new ClientSimpsonService(null); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // expected } new ClientSimpsonService(remoteSimpsonServiceMock); }}
上面的黑體程式碼中,我們建立了一個ISimpsonService.class的mock,它擁有和ISimpsonService一樣
的
介面。
同樣的方法,我們可以定義ISimpsonService返回的物件IEpisode
import static org.easymock.EasyMock.createMock;import static org.easymock.EasyMock.expect;import static org.easymock.EasyMock.replay;import static org.easymock.EasyMock.verify;import junit.framework.TestCase;public class ClientSimpsonServiceTest extends TestCase { private IEpisode episode17Mock; private ISimpsonService remoteSimpsonServiceMock; protected void setUp() throws Exception { super.setUp(); episode17Mock = createMock(IEpisode.class); remoteSimpsonServiceMock = createMock(ISimpsonService.class); }... public void testGetEpisode() throws Exception { expect(remoteSimpsonServiceMock.getEpisode(17)) .andReturn(episode17Mock); replay(remoteSimpsonServiceMock); ISimpsonService clientSimpsonService = new ClientSimpsonService(remoteSimpsonServiceMock); IEpisode result = clientSimpsonService.getEpisode(17); verify(remoteSimpsonServiceMock); assertEquals(episode17Mock, result); }
上文僅僅是拋磚引玉,想了解更多EasyMock,請參看
http://today.java.net/pub/a/today/2006/06/20/getting-started-with-easymock-2.html
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=817575
相關文章
- Mock 在 Python 單元測試中的使用MockPython
- 單元測試:單元測試中的mockMock
- 首次在WebAPI中寫單元測試WebAPI
- 在C#中進行單元測試C#
- 單元測試在Unity中的應用Unity
- .net持續整合單元測試篇之單元測試簡介以及在visual studio中配置Nunit使用環境
- 測試 之Java單元測試、Android單元測試JavaAndroid
- 單元測試工具 TestNG 使用
- Python中的單元測試框架:使用unittest進行有效測試Python框架
- java中的單元測試Java
- 使用JUnit進行單元測試
- Cmocka 單元測試配置與使用Mock
- 使用jest進行單元測試
- PHP單元測試框架PHPUnit的使用PHP框架
- springboot系列文章之使用單元測試Spring Boot
- 使用Jest進行React單元測試React
- 如何使用MOQ進行單元測試
- 使用 Spring Boot 進行單元測試Spring Boot
- 單元測試,只是測試嗎?
- 單元測試-【轉】論單元測試的重要性
- 鮑勃大爺:單元測試中單元是多小?
- .NET 專案中的單元測試
- SpringBoot單元測試Spring Boot
- python 單元測試Python
- iOS 單元測試iOS
- Flutter 單元測試Flutter
- 單元測試 Convey
- 單元測試真
- golang單元測試Golang
- 單元測試工具
- 前端單元測試前端
- 十五、單元測試
- Go單元測試Go
- 聊聊單元測試
- 實戰指南:使用 xUnit.DependencyInjection 在單元測試中實現依賴注入【完整教程】依賴注入
- Java中的單元測試與整合測試最佳實踐Java
- vue單元測試vue test utils使用初探Vue
- Laravel 單元測試認證使用者Laravel
- 前端測試:Part II (單元測試)前端