2015-10-07 58 views
0

我正在模擬對象,我在設置單元測試時遇到問題,它檢查列表是否正確排序。這個自負是我嘲笑一個時鐘,但簡單地使用times()方法是行不通的。該列表應該按照升序排列,但獲取第一個索引只是返回最後設置的任何值。在模擬對象單元測試中遇到問題

作爲參考,這裏正被設置在午夜,測試時鐘工作模擬測試:

@Test 
public void shouldSetAtMidnight() { 
    expect(mock.instant()).andReturn(Instant.from(this.midnight)); 

    expect(mock.getZone()).andReturn(this.timeZone); 

    replay(mock); 

    this.st.setDesiredValue(72); 
    SetPoint[] sched = this.st.getSchedule(); 

    verify(mock); 

    assertEquals(LocalTime.MIDNIGHT, sched[0].getScheduledTime()); 
} 

在此,設置所希望的值是,它增加了一個設定點陣列唯一重要的(setDesiredValue創建具有int和LocalTime的SetPoint)。這是我遇到的困難:

@Test 
public void shouldOrderTwoSetPointsAddedOutOfOrder() { 
    expect(mock.instant()).andReturn(Instant.from(this.midnight)).times(2); 

    expect(mock.getZone()).andReturn(this.timeZone).times(2); 

    replay(mock); 

    this.st.setDesiredValue(73); 
    this.st.setDesiredValue(71); 
    SetPoint[] schedule = this.st.getSchedule(); 

    verify(mock); 

    assertEquals(71, schedule[0].getTemp()); 
} 

setDesiredValue應該與本地時間,在這種情況下應該是半夜一個int值相關聯。然後它將具有這些特徵的SetPoint添加到列表中,並調用Collection的sort()方法將它們從最低排序到最高排序。現在,我假設我的問題在於,儘管爲了這兩個期望調用了次數(2),但我在同一時間將兩個值關聯起來,但最近我只是開始使用模擬對象,而沒有知識他們知道該從哪裏出發。運行此測試將返回73而不是71.

回答

1

您的假設是正確的。當你說.andReturn(Instant.from(this.midnight)).times(2)時,傳遞給.andReturn的確切值會重複兩次。

你可以做.andReturn(Instant.from(this.midnight)).andReturn(Instant.from(this.midnight)),這會給你兩個瞬間。但作爲一般規則,這對於單元測試來說是非常糟糕的形式。 Instant.from(this.midnight)來自測試外,所以您無法預測兩次調用此函數是否會導致相同的值或不同的值,從而使測試不確定。好的一個集成測試,單元測試不行,你會在哪裏使用mock。最好使用一個實數,如.andReturn(Instant.fromEpochSecond(10)).andReturn(Instant.fromEpochSecond(15))

你不提供一大堆的約st和細節的任何原因,你想測試不應該返回73,而不是71

+0

感謝您的幫助。這徹底解決了我的問題。 – jt90133

相關問題