我有service方法:
Entity entity = new Entity(new Date(), 1, 2L);
return entityRepository.save(entity);
我的測驗:
@Test
public void testSaveEntity() {
Entity entity = new Entity(new Date(), 1, 2L);
entityService.saveEntity(1, 2L);
verify(entityRepository, times(1)).save(entity);
}
如果Entity equals()不比較Date,那么一切都很好,但如果比較Date,那么測驗就會拋出Argument(s) are different!
uj5u.com熱心網友回復:
據我了解,不可能更改服務和物體。那么在這種情況下,最好使用ArgumentMatcher<>in Mockito。
第1步 :
@AllArgsConstructor
public class EntityMatcher implements ArgumentMatcher<Entity> {
private Entity left;
@Override
public boolean matches(Entity right) {
return (left.getEventDate().getTime() - right.getEventDate().getTime() <= 1000));
}
}
在這里,您覆寫equals了將比較物件的內容。mathces可以ovveride隨心所欲。我認為一秒鐘的差異就足夠了。
第2步:
verify(entityRepository).save(argThat(new EntityMatcher(new Entity(new Date(), 1, 2L))));
其他情況:
很可能,在其他測驗中,可能會出現這種情況,這entity也需要檢查when
when(entityRepository.save(any(Entity.class))).thenReturn(new Entity(new Date(), 1, 2L));
uj5u.com熱心網友回復:
您有 2 個選項:
選項 1:使用 Clock 類來控制時間
而不是使用new Date():
- 向您的服務注入一個
Clock實體 - 使用它的方法來檢索當前時間
- 在您的測驗代碼中,用于
Clock.fixed控制當前時間
請參閱Java 時鐘類指南
選項 1:放寬匹配要求
使用Mockito ArgumentMatchers放寬匹配要求 - 用于any(YourEntity.class)匹配任何YourEntity,或為您的物體撰寫自定義引數匹配器。
uj5u.com熱心網友回復:
您可能對equals方法的定義有疑問。您應該定義在哪些情況下兩個不同的物體被視為相等:
只有當它們的日期值在同一
毫秒內時,兩個物體才相等,還是我們只關心秒、分鐘或天?
與處理浮點值類似,這個可接受的差異可以類似于計算兩個 Java 日期實體之間的差異來計算
uj5u.com熱心網友回復:
問題是,當您Date在不同的時刻創建兩個時,它們將不相等。所以你的測驗會失敗。這是一個簡單的概念證明:
@Test
public void test_date_equal() throws Exception {
Date date1 = new Date();
Thread.sleep(1);
Date date2 = new Date();
Assert.assertEquals(date1, date2); // fail
}
因此,new Date在大多數情況下,比較兩個是不穩定的。我認為你應該盡可能避免直接new Date在不同的地方使用。
我有一個方法,但你應該稍微重構你的生產代碼。這個想法只是在您的上添加一個日期引數saveEntityForCandidate:
@Service
public class EntityService {
public boolean saveEntityForCandidate(Date date, int whatever, long whatever2) {
// ...
Entity entity = new Entity(date, whatever, whatever2);
return entityRepository.save(entity);
}
}
在測驗中:
@Test
public void testSaveEntity() {
Date date = new Date();
HistoryEntity entity = new HistoryEntity(date, 1, 2L);
entityService.saveEntityForCandidate(date, 1, 2L);
verify(entityRepository, times(1)).save(entity);
}
它將按您的預期作業,因為您的兩個物體之間沒有不同的引數。
如果你不能重構你的代碼,那么你可以試試 Powermock。但是模擬一個不屬于你的物件被認為是測驗中的反模式。
https://stackoverflow.com/a/30415404/5485454
uj5u.com熱心網友回復:
而不是依賴equals于您的解決方案中使用的方法:
verify(entityRepository, times(1)).save(entity);
您可以嘗試捕獲 Argument 并在下一步中斷言它,如使用 mockito 驗證物件屬性值中所述
ArgumentCaptor<Entity> argument = ArgumentCaptor.forClass(Entity.class);
verify(entityRepository, times(1)).save((argument.capture());
assertEquals(1, argument.getValue().getWhatever());
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478946.html
上一篇:curlPOST上傳檔案測驗
