繁体   English   中英

使用Mockito模拟具有对象参数的方法

[英]Mock a method with an object parameter with Mockito

在我的单元测试中,我想通过执行以下操作来模拟与Elasticsearch的交互

when(cityDefinitionRepository.findCitiesNearby(geoPoint, SOURCE, 2)).thenReturn(cityDefinitionsArrival);
when(cityDefinitionRepository.findCitiesNearby(geoPoint2, SOURCE, 2)).thenReturn(cityDefinitionsDeparture);
SearchResult results = benerailService.doSearch(interpretation, 2, false);

doSearch方法包含

departureCityDefinitions = cityDefinitionRepository.findCitiesNearby(geo, SOURCE, distance);

当我调试代码时,我看到在我的doSearch方法中调用了模仿对象,但它没有返回cityDefinitionsArrival对象。 这可能是因为geoPoint和geo是两个不同的对象。

geoPoint和geo对象都是弹性搜索的GeoPoint,都包含相同的纬度和经度。

我设法做到这一点

when(cityDefinitionRepository.findCitiesNearby(any(geoPoint.getClass()), eq(SOURCE), eq(2))).thenReturn(cityDefinitionsArrival);
when(cityDefinitionRepository.findCitiesNearby(any(geoPoint2.getClass()), eq(SOURCE), eq(2))).thenReturn(cityDefinitionsDeparture);

但是现在它忽略了我的纬度和经度值,并接受了GeoPoint类的任何对象。 这是一个问题,因为在我的doSearch方法中,我使用了findCitiesNearby的两种用法,每种用法都有不同的纬度和经度,因此我需要分别模拟它们。

Mockito是否可能?

cityDefinitionsArrival和cityDefinitionsDeparture都是ArrayList,SOURCE是String值,而geo和geoPoint对象是:

GeoPoint geoPoint = new GeoPoint(50.850449999999995, 4.34878);
GeoPoint geoPoint2 = new GeoPoint(48.861710, 2.348923);

double lat = 50.850449999999995;
double lon = 4.34878;
GeoPoint geo = new GeoPoint(lat, lon);

double lat2 = 48.861710;
double lon2 = 2.348923;
GeoPoint geo2 = new GeoPoint(lat2, lon2);

使用argThat

public final class IsSameLatLong extends ArgumentMatcher<GeoPoint> {

  private final GeoPoint as;

  public IsSameLatLong(GeoPoint as) {
      this.as = as;
  }

  //some sensible value, like 1000th of a second i.e. 0° 0' 0.001"
  private final static double EPSILON = 1.0/(60*60*1000); 

  private static boolean closeEnough(double a, double b) {
     return Math.abs(a - b) < EPSILON;
  }

  public boolean matches(Object point) {
      GeoPoint other = (GeoPoint) point;
      if (other == null) return false;
      return closeEnough(other.getLat(), as.getLat()) &&
             closeEnough(other.getLong(), as.getLong());
  }
}

然后像这样使用:

when(cityDefinitionRepository.findCitiesNearby(argThat(new IsSameLatLong(geoPoint)), eq(SOURCE), eq(2))).thenReturn(cityDefinitionsArrival);
when(cityDefinitionRepository.findCitiesNearby(argThat(new IsSameLatLong(geoPoint2)), eq(SOURCE), eq(2))).thenReturn(cityDefinitionsDeparture);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM