在單元測試中使用EasyMock

gudesheng發表於2008-01-03

我們每天的開發中都要編寫大量的單元測試,很多單元測試的物件是相對獨立的,例如一個所得稅計算的模組,但是更多的單元測試需要依賴其他的元件或者服務。因此,我們需要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


相關文章