首页 > 解决方案 > 验证方法中的参数是不同的错误,因为输入参数的类型为时间戳

问题描述

我正在尝试通过模拟存储库来测试 Spring JPA 存储库。存储库的输入参数是 long 和 timestamp 类型。

由于两次调用之间的时间戳输入不同,因此出现了问题。我尝试使用 argThat 但无法将其用于时间戳对象。有没有其他方法可以解决这个问题?

`@Before
public void setUp(){
    MockitoAnnotations.initMocks(this);
    collActivity = new CollActivity();
    Long time = System.currentTimeMillis();     
    Timestamp lastUpdate = new java.sql.Timestamp(time);
    collActivity.setCollId(1162L);
    collActivity.setGId(new BigDecimal(25));
    collActivity.setLastUpdate(lastUpdate);     
}`

`@Test
public void testUpdateCollActivity(){   
        Long collectionID = 5044L;      
        Long time = System.currentTimeMillis();                 
        when(typeRepo.getCollId(new Long(100033334L))).thenReturn(new 
     BigDecimal(2244));
        when(collRepository.updateCollActivity(collID, 
     lastUpdate)).thenReturn(1);            
        int i = collAcivityController.updateCollActivity("1000234");
     verify(collRepository).updateCollActivity(collID,
                                           collActivity.getLastUpdate());
}

JUnit 测试在验证调用时失败,因为在调用存储库时时间戳有微小差异,错误如下:

论据不同!通缉:collRepository.updateColActivity(5044, 2019-10-28 12:44:49.738);

实际调用有不同的参数: collRepository.updateColActivity( 5044, 2019-10-28 12:44:49.777 );

标签: spring-bootmockitojunit4

解决方案


您可以Mockito.any()在以下类型的情况下使用:

@Test
public void testUpdateCollActivity(){   
        Long collectionID = 5044L;      
        Long time = System.currentTimeMillis();                 
        when(typeRepo.getCollId(Mockito.anyLong())).thenReturn(new 
     BigDecimal(2244));
        when(collRepository.updateCollActivity(Mockito.anyLong(), 
     Mockito.anyLong())).thenReturn(1);            
        int i = collAcivityController.updateCollActivity("1000234");
     verify(collRepository).updateCollActivity(collID,
                                           collActivity.getLastUpdate());
}

Mockito.any()如果您不确定数据类型,也可以使用。


推荐阅读