【发布时间】:2016-04-07 20:45:02
【问题描述】:
在我的单元测试中,我想通过执行以下操作来模拟与 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 方法中调用了 mockito,但它没有返回 cityDefinitionsArrival 对象。这可能是因为 geoPoint 和 geo 是两个不同的对象。
geoPoint和geo对象都是elasticsearch GeoPoints,包含相同的经纬度。
我设法让它工作了
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 都是 ArrayLists, SOURCE 是一个字符串值,并且 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);
【问题讨论】:
-
大家都清楚,当
GeoPoint对象具有一定的纬度/经度坐标时,您想模拟行为,对吗? -
如果
GeoPoint类定义了equals方法,我想你应该可以使用eq()匹配器。如果没有,请实现自定义 MockitoArgumentMatcher。 -
@RobbyCornelissen 那么它默认做什么呢?
==比较? -
@TimBiegeleisen 正确,返回 cityDefinitionsArrival 或 cityDefinitionsDeparture 取决于使用的纬度和经度。如果是地理,则返回 cityDefinitionsArrival。如果是 geo2,则返回 cityDefinitionsDeparture。
-
@GlennVanSchil 我后来添加了它:) 应该像实现
class GeoPointMatcher extends ArgumentMatcher<GeoPoint>及其matches()方法一样简单。
标签: java unit-testing mockito matcher stubbing