Я не знаком с Mockito (потому что я использую JMock ), но общий подход к написанию тестов с имитациями такой же.
Сначала вам нужен экземпляр тестируемого класса (CUT) (RegistrationController
). Это НЕ должно быть издевательством - потому что вы хотите это проверить.
Для тестирования getUploadForm
CUT-экземпляру не нужны никакие зависимости, поэтому вы можете создать его с помощью new RegistrationController
.
Тогда у вас должна быть тестовая шляпа, которая выглядит примерно так
RegistrationController controller = new RegistrationController();
Model model = new Model();
String result = controller(model);
assertEquals("is/Registration", result);
assertSomeContstrainsFormodel
Это было легко.
Следующий метод, который вы хотите проверить, это create
Метод. Это гораздо сложнее.
- Вам нужно иметь экземпляр объекта параметров (
BindingResult
), может быть немного сложнее
- Вам нужно обработать файлы в тесте (потом удалить их) - я не буду обсуждать эту проблему. Но, возможно, вам стоит подумать, как использовать временные файлы для теста.
- Вы используете обе переменные
registrationService
и uploadFileLocation
- это интересная часть.
uploadFileLocation
- это просто поле, которое должно быть установлено в тесте. Самый простой способ - добавить установщик (getter и) для установки того, что подано в тесте. Вы также можете использовать org.springframework.test.util.ReflectionTestUtils
для установки этого поля. - у обоих способов есть плюсы и минусы.
Более интересно registrationService
. Это должно быть издеваться! Вам нужно создать Mock для этого класса, а затем «внедрить» этот макет в экземпляр CUT. Как и для uploadFileLocation
, у вас есть по крайней мере те же два варианта.
Затем вам нужно определить исключения, которые у вас есть для макета: registrationService.processFile(uploadedFile, userDetails)
вызывается с правильным файлом и данными пользователя. (насколько точно это исключение определено как часть Mockito - и мне не хватает знаний).
Затем вам нужно вызвать метод, который вы хотите проверить на CUT.
Кстати: если вам нужно очень часто "вставлять" макеты в бины Spring, вы можете создать свою собственную утилиту. Это получает экземпляр объекта, сканирует этот объект на наличие полей с аннотациями @Inject
, создает Mocks для этого и «внедряет» это mocks. (Тогда вам нужен только getter для доступа к макетам, чтобы определить их ожидания.) - Я создал такой инструмент для JMock, и он мне очень помог.