2012-06-01 66 views
2

我有一段這樣的代碼:嘲笑在的Mockito的東西,我們不能明確指定

class Lekcja { 
     Calendar _date; 
     public Lekcja() { 
      _date = Calendar.getInstance(); 
     } 
     public Calendar getDate() { 
      return _date; 
     } 
    } 

而且我希望它使用JUnit4和的Mockito,而不是使用實際日曆對象我想測試在那裏放置一個模擬對象。你能告訴我該怎麼做嗎?

+0

從技術上講,你可以用PowerMock做這種嘲笑,但你真的應該和Tomasz一起回答。 –

+0

請勿測試此課程。它沒有任何邏輯,所以不存在邏輯錯誤的可能性,因此對其進行測試沒有任何好處。認真對待不同的事情花時間。 –

回答

3

嘲笑價值對象很少是一個好主意。你應該嘲笑行爲,而不是數據。我想你真正想要實現的是能夠在測試中使用任意日期(這是一個好主意)。

我在這種情況下,成功地利用該模式是fake system clock(從該網站的例子):

public interface TimeSource { 
    long currentTimeMillis(); 
} 

而且兩種實現方式,真正:

public final class RealSource implements TimeSource { 

    public long currentTimeMillis() { 
    return System.currentTimeMillis(); 
    } 

} 

和假來進行測試:

public final class FakeSource implements TimeSource { 

    public long currentTimeMillis() { 
    return //...whatever you want 
    } 

} 

我發現在輔助方法中使currentTimeMillis()靜態化很方便od並使用static字段指向當前TimeSource

最後,更簡單的方法是通過直接日期:

class Lekcja { 
    Calendar _date; 
    public Lekcja(Calendar date) { 
     this._date = date; 
    } 
    //... 
} 

2

見你可以使用PowerMock

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Calendar.class) 
public class LekcjaTest { 
    private Lekcja lekcja; 
    private Date myDate; 

    @Before 
    public void setUp() { 
     myDate = mock(Date.class); 

     PowerMockito.mockStatic(Calendar.class); 
     PowerMockito.when(Calendar.getInstance()).thenReturn(myDate); 
    } 

    @Test 
    public void calendarTest() { 
     lekcja = new Lekcja(); 

     //verifies that the static call has been made 
     PowerMockito.verifyStatic(); 
     Calendar.getInstance(); 

     assertEquals(myDate, lekcja.getDate()); 
    } 
}