Я использую JMockit для тестирования приложения (Java 8, Junit 4.12, JMockit 1.17).
У меня есть код, который должен загружать данные в список конечных точек.
Класс, который фактически выполняет загрузку в конечную точку, называется PlatformDataUploader. У этого класса есть метод, называемый «выгрузка», который выполняет одиночную «загрузку» в единственную конечную точку. Этот метод принимает имя места назначения (которое представляет собой двухсимвольную строку и загружаемый объект). На основе имени места назначения он формирует URL-адрес, по которому должны быть отправлены данные.
Я хотел бы создать тест, который просто подтверждает, что при выполнении приложения метод загрузки PlatformDataUploader вызывается ожидаемое количество раз (7 раз, поскольку приложение в настоящее время настроено для загрузки данных на 7 конечных точек). Я хотел бы подтвердить, что строка назначения, которая передается методу загрузки, является ожидаемой, но меня не интересуют отправляемые данные (представленные экземпляром PlatformInstallationData).
Упрощенная версия кода приложения выглядит следующим образом:
...
private boolean uploadToServices(final List<String> serviceNames) {
boolean allGood = true;
PlatformDataUploader platformDataUploader = new PlatformDataUploader();
for (String serviceName : serviceNames) {
LOG.info("Attempting to upload to " + serviceName + "...");
// construct object to send
PlatformInstallationData platformInstallationData = new PlatformInstallationData();
...
// code here that adds content to platformInstallationData
...
// send object to endpoint of this service
allGood = allGood &&
platformDataUploader.upload(serviceName, platformInstallationData);
}
return allGood;
}
Упрощенная версия тестового кода выглядит следующим образом:
@Test
public void whenUploadThenExpectedCallsToUploader(@Mocked final PlatformDataUploader platformDataUploader,
@Mocked final PlatformInstallationData platformInstallationData)
throws IOException {
UploaderApplication target = new UploaderApplication();
new Expectations() {
{
platformDataUploader.upload("AP", platformInstallationData);
result = true;
times = 1;
platformDataUploader.upload("VV", platformInstallationData);
result = true;
times = 1;
...
THE REST OF THE EXPECTED CALLS
...
}
};
target.execute(params);
}
Когда я выполняю тест, я получаю: «mockit.internal.MissingInvocation: Missing 1 invocation». Это относится к первой строке в ожиданиях, которые я определил.
Проблема, похоже, в том, что второй аргумент в методе загрузки, который является имитацией PlatformInstallationData, не соответствует экземпляру, созданному в коде приложения (хотя этот экземпляр также должен быть имитируемым).
Чтобы попытаться понять, что происходит, я провел тест, в котором я удалил второй аргумент из метода загрузки (из кода приложения и из тестового кода), поэтому ему нужно было только сопоставить строку, например «AP», с строка, которая существует в приложении в этот момент, и в этом случае она совпала правильно. Итак, я знаю, что при таком подходе он может правильно сопоставить строку, но не может сопоставить имитируемый объект PlatformInstallationData.
Меня удивляет такое поведение, так как я был уверен, что раньше мне удавалось создавать ожидания, включающие в себя имитируемые объекты в качестве аргументов метода, и я думал, что это соответствует им правильно.
Может ли кто-нибудь объяснить это поведение и, возможно, предложить, как это следует проверить. Большое спасибо!