Эти два утверждения действительно являются вещами, которые вы хотите выделить в своем модульном тесте:
private void populateEachVehicleDetail(String datasetId, Integer vehicleId, List<VehicleResponse> vehiclesList, CountDownLatch latch) throws ApiException {
....
VehiclesApi vehiclesApi = new VehiclesApi();
vehiclesApi.vehiclesGetVehicleAsync(datasetId,vehicleId,vehicleResponseApiCallback);
...
}
1) Сделать вашу зависимость зависимой
Но вы можете высмеивать только то, что можетеустанавливается со стороны клиента класса.
Здесь API является локальной переменной.Таким образом, вы должны изменить свой класс, чтобы показать зависимость, например, в конструкторе.
Таким образом, вы можете легко смоделировать его.
2) Сделайте, чтобы ваш макет не возвращал результат, а вызывал обратный вызов.
В контексте синхронного вызова вы хотите смоделировать возвращаемый результат.
В контексте асинхронного вызова с обратным вызовом все иначе.Действительно, обратные вызовы не возвращаются вызывающей стороне, но обратные вызовы вызываются для предоставления результата вызова. Итак, здесь вы хотите, чтобы смоделированный API вызывал обратный вызов onSuccess()
с проверенными параметрами, представляющими набор данных для вашего модульного теста:
@Override
synchronized public void onSuccess(VehicleResponse result, int statusCode, Map<String, List<String>> responseHeaders) {
vehiclesList.add(result);
latch.countDown();
}
В своем модульном тесте вы должны смоделировать таким образом обратный вызов для каждого ожидаемого вызова:
@Mock
VehiclesApi vehiclesApiMock;
// ...
// when the api method is invoked with the expected dataSetId and vehicleId
Mockito.when(vehiclesApiMock.vehiclesGetVehicleAsync(Mockito.eq(datasetId), Mockito.eq(vehicleId),
Mockito.any(ApiCallback.class)))
// I want to invoke the callback with the mocked data
.then(invocationOnMock -> {
ApiCallback<VehicleResponse> callback = invocationOnMock.getArgument(2);
callback.onSuccess(mockedVehicleResponse, mockedStatusCode,
mockedResponseHeaders);
return null; // it is a void method. So no value to return in T then(...).
});
Я думаю, что приведение отсутствует для ApiCallback
, но вы должны иметьобщая идея.