2009-08-13 55 views
2

我剛進入easymock.i'll''''''''''''''''''''''''''''''s'all要求如果easymock只是模擬對象的接口? 因此,在我努力理解的情況下,我寫了一個類來在java.i中生成唯一憑證,顯然無法知道它將在assert stuff中使用哪個值。因此,如何確保生成的憑證的類型是long?使用easymock驗證對象類型

這裏是功能

public static Long generateID(int length) { 
    logger.info("Calling generateID with specify length"); 
    Long result = null; 

    if (length > 0) { 
     StringBuffer id = new StringBuffer(length); 
     for (int i = 0; i < length; i++) { 
      id.append(NUMS[(int)Math.floor(Math.random() * 20)]); 
     } 
     result = Long.parseLong(id.toString()); 
    } 

    return result; 
} 

下面是測試類

@Before 
public void setUp() { 
    mockgenerator = createMock(VGenerator.class); 
} 


/** 
* Test of generateID method, of class VGenerator. 
*/ 
@Test 
public void testGenerateID() { 
    Long exp = (long)1; 
    int length = 15; 
    expect(mockgenerator.generateID(length)).equals(Long.class); 
    replay(mockgenerator); 
    long res = mockgenerator.generatedID(length); 
    assertEquals(exp.class, res.class); 
} 

以及這可能看起來棒極了你,但我仍然感到困惑如何做到這一點 感謝幫助

+0

如果generateID()試圖返回不是很長的東西,那麼該類甚至不會編譯。 – 2009-08-13 21:05:31

回答

0

如果確定返回類型爲long並且您希望確保未來的更改不會無意中更改此設置,那麼您不需要easymock。只是這樣做:

@Test 
public void TestGenerateIDReturnsLong() 
{ 
    Method method = 
     VGenerator.class.getDeclaredMethod("generateID", new Class[0]); 
    Assert.Equals(long.Class, method.GetReturnType()); 
} 

目前正在生成模擬實現的VGenerator,然後測試模擬。這是不是有用。單元測試的重點是測試一個真正的實現。所以現在你可能想知道mock有什麼好處?

作爲一個例子,假設VGenerator需要內部使用一個隨機數發生器,並且在構造提供這個(這被稱爲「依賴注入」):

public VGenerator 
{ 
    private final RandomNumberGenerator rng; 

    // constructor 
    public VGenerator(RandomNumberGenerator rng) 
    { 
     this.rng = rng; 
    } 

    public long generateID(length) 
    { 
     double randomNumber = this.rng.getRandomNumber(); 
     // ... use random number in calculation somehow ... 
     return id; 
    } 
} 

當實現VGenerator,你是對測試隨機數發生器沒有真正的興趣。你感興趣的是VGenerator如何調用隨機數發生器,以及它如何使用結果產生輸出。你需要的是採取測試的目的隨機數生成器的完全控制,這樣你就創建它 一個模擬:

@Test 
public void TestGenerateId() 
{ 
    RandomNumberGenerator mockRNG = createMock(RandomNumberGenerator.class); 
    expect(mockRNG.getRandomNumber()).andReturn(0.123); 
    replay(mockRNG); 

    VGenerator vgenerator = new VGenerator(mockRNG); 
    long id = vgenerator.generateID(); 
    Assert.Equals(5,id); // e.g. given random number .123, result should be 5 

    verify(mockRNG); 
} 
+0

我欣賞解釋。謝謝 – 2009-08-14 10:03:20

3

我相信你誤解了如何使用easymock, 調用expect期間告訴模擬對象,當你重放它時,這應該調用call。 Append .andReturn()告訴模擬對象返回你放在那裏的任何東西,在我的例子中,長整型值爲1. easymock的要點是,你不需要實現模擬接口來測試使用它的類。通過嘲笑你可以從它所依賴的類中分離一個類,並只測試你當前正在測試的類中包含的代碼。

interface VGenerator { 
    public Long generateID(int in); 
} 


@Before 
public void setUp() { 
    mockgenerator = createMock(VGenerator.class); 
} 


@Test 
public void testGenerateID() { 
    int length = 15; 
    expect(mockgenerator.generateID(length)).andReturn(new Long(1)); 
    replay(mockgenerator); 
    myMethodToBeTested(); 
    verify(mockgenerator); 
} 

public void myMethodToBeTested(){ 
    //do stuff 
    long res = mockgenerator.generatedID(length); 
    //do stuff 
} 

如果我誤解了你的問題,它確實是,easyMock只模擬接口嗎?那麼答案是肯定的,Easymock只會嘲笑接口。閱讀文檔以獲取更多幫助Easymock

+0

非常好的解釋。我喜歡它。感謝 – 2009-08-14 09:39:21

0

EasyMock Class extension可以模擬類。它是EasyMock的擴展。它仍然可以模擬接口,所以它幾乎是EasyMock的替代品。

但是,在你的情況下,你試圖嘲笑一種靜態方法。靜態方法不能被嘲笑,因爲它們不能被重載。你需要班級儀器來做這些EasyMock不能做的事情。