Как издеваться над серверными/http-запросами в Codename One для тестирования?

Я хочу написать функциональные тесты для моего приложения Codename One.

Для этого мне нужно иметь возможность имитировать некоторые ответы сервера, чтобы они возвращали именно то, что мне нужно для конкретного теста.

Одна вещь, которую я пытался сделать, чтобы функции, отправляющие HTTP-запросы, принимали ConnectionRequest в качестве параметра, таким образом, я могу ввести что-то для имитации задержки в сети, а затем вызвать обратный вызов с поддельным ответом.

Однако, когда я пытаюсь внедрить макеты ConnectionRequest в методе подготовки модульного теста, они все равно вводятся после запуска приложения, что не работает в моем случае, поскольку я отправил HTTP-запрос при запуске приложения.

Можно ли издеваться над ConnectionRequest или сделать что-то эквивалентное перед запуском приложения?


person Hristo Vrigazov    schedule 15.10.2016    source источник
comment
У нас нет ничего подобного в Codename One. Однако вы можете взломать некоторые макеты JavaSE для работы с симулятором.   -  person Shai Almog    schedule 16.10.2016


Ответы (2)


Вы можете замедлить подключение в симуляторе, который будет имитировать медленное подключение на устройствах, или полностью отключить его, чтобы имитировать Нет подключения к Интернету. Найдите параметры в симуляторе в разделе Симуляция -> Сеть. Измените этот параметр на Slow connection или Disconnected и перезапустите приложение.

Укажите неправильный URL-адрес, чтобы имитировать ошибку 404.

Возврат нечитаемых данных из кода на стороне сервера для имитации исключения IOException или NullPointer.

При этом убедитесь, что ваш сетевой монитор виден. Большинство других ответов, которые вы хотите, могут быть выполнены на стороне вашего сервера.

person Diamond    schedule 15.10.2016
comment
Спасибо за ответ! Но в этом случае я хочу, чтобы, например, конечная точка сервера могла возвращать два возможных ответа, и я хочу проверить, правильно ли работает приложение для каждого из них. Поскольку функциональные тесты автоматизированы, я не могу жестко закодировать ответ на сервере. Я ищу что-то вроде https://docs.angularjs.org/api/ngMock/service/$httpBackend в Angular, в основном вы говорите: для этого автоматического теста ожидайте этот HTTP-запрос и отвечайте этим HTTP-ответом. После некоторых исследований я думаю, что это невозможно в Codename One. - person Hristo Vrigazov; 15.10.2016

Вот что я в итоге сделал. Я публикую это, если кому-то нужен обходной путь для автоматических тестов.

  1. Напишите интерфейс с именем HTTPRequestInterface, который предоставляет необходимые методы для создания HTTP-запроса.
  2. Создайте реализацию HTTPRequestInterface, скажем, HTTPRequest, которая является просто оболочкой для ConnectionRequest.
  3. Создайте класс для создания HTTPRequests, скажем, HTTPRequestFactory, который имеет статический метод с именем create и метод с именем setMock. Этот класс создает обычный HTTPRequest, если макет не был установлен, и указанный макет, если макет был установлен.
  4. Замените все ConnectionRequest на HTTPRequestFactory.create()
  5. Создайте класс InitialSetup, который имеет два метода: setInitialization, который принимает Runnable для выполнения, и метод init, который просто запускает Runnable.
  6. В методе start вызовите InitialSetup.init
  7. Теперь в тестах, в методе подготовки, я могу установить желаемый макет, и приложение, когда не выполняются автоматические тесты, будет отправлять запросы на реальный сервер.

Требует некоторых усилий, но автоматизированные тесты с mocked backend внушают уверенность, которая, я думаю, определенно того стоит!

person Hristo Vrigazov    schedule 16.10.2016