2013-08-05 6 views
1

Я запускаю некоторый код Scala (с библиотекой Java socialAuth Java), для которого требуется передать HTTPServletRequest в качестве параметра.Как протестировать код, которому необходимо пройти HTTPServletRequest

def myClass(prov: String, site: String, request: HttpServletRequest): { 
    //some initial code here 

    val session = request.getSession() 
    session.setAttribute(/*some params*/) 

    //code continues... 

} 

Так HttpServletRequest кажется действительно прохладным способом хранения переменного сеанса и прохождения сеанса между методами. Тем не менее, я не совсем уверен, как проверить этот код, так как я действительно не понимаю, что интерфейс HttpServletRequest -.

Я провел несколько исследований, но мне было интересно, может ли кто-нибудь разъяснить мне. HttpServletRequest - это интерфейс, который означает, что он не может быть создан самостоятельно. Как, тогда он используется в коде?

EDIT: как в случае, когда метод принимает параметр HttpServletRequest в качестве параметра, какой класс реализации обычно передается?


Followup: На основании ответов, HttpServletRequest реализуется по-разному различными серверами; Идридер отметил, например, что Apache даже имеет несколько реализаций. Как же тогда код указывает, что сервер должен использовать его реализацию? Другими словами, позволяет сказать, что у меня есть тестовый код, который использует MyClass:

def otherClass(){ 
    val site = "www.example.com" 
    val provider = "twitter" 
    val mockRequest = mock(HttpServletRequest.class) //using https://code.google.com/p/mockito/. (eclipse throws error..not too sure about syntax but throwing up this example quickly, so will edit later) 

    myClass(provider, site, mockRequest) 
    } 

Я предполагаю, что это нормально для тестирования, так как Mockito создает фиктивный объект, но когда OtherClass() должен быть реализован на сервере, как его код скорректирован? (Извините, я немного новичок в этом, так что медведь со мной ...) Если val mockRequest необходимо реализовать с помощью любой реализации HttpServletRequest, используемой сервером (Apache, Oracle и т. Д.), Как пользователь указывает это в otherClass? Будет что-то вроде этого изменения:

//deleted line: --val mockRequest = mock(HttpServletRequest.class) 
//changed line: myClass(provider, site, mockRequest) to below: 

myClass(provider, site, javax.servlet.http.HttpServletRequest) 

быть корректно интерпретировано и реализовано сервером?

+0

Кажется, вы немного опережаете себя, если вы кодируете scala и не знаете, что такое интерфейс. Как работает признак? –

+0

... Классы интерфейса реализации. Интерфейсы определяют контракт для базовой реализации. Интерфейсы не могут быть созданы, но классы * реализующие * интерфейсы могут. И нет, привязка кода к спецификации сервлета - не очень классный способ сделать что-либо, потому что тогда вы должны издеваться над материалом, который на самом деле является лишь тонким слоем между веб-клиентами и кодом, который делает важные вещи. –

+0

Мне было интересно, если бы у кого-либо из вас был опыт работы с сервлетами Java и были знакомы с тем, какие классы-реализации HttpServletRequest наиболее часто используются при тестировании программ, которые принимают HttpServletRequest в качестве параметра –

ответ

3

Контейнерные реализации, такие как Oracle или Apache, расширяют интерфейс HttpServletRequest с их собственными реализациями, которые на самом деле что-то делают. Вы можете сделать то же самое для своего тестирования, или использовать что-то вроде Mockito, чтобы издеваться над этим.

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

Если вам нужно проверить поведение вашего кода при работе в контейнере сервлета, вы можете выполнить ручное тестирование , или использовать структуру тестирования, которая делает HTTP-запросы, например HttpUnit

+0

Спасибо Ireeder. Итак, когда один тест программы на сервере Apache, например, использует ли Apache собственную реализацию HttpServletRequest? –

+0

Возможно, ключевой момент, который вам не хватает, заключается в том, что инфраструктура предоставит некоторую фабрику (или, возможно, инъекцию), которая абстрактно перекроет разрыв между интерфейсом (который вы видите) и внутренней реализацией, которая реализует этот интерфейс (который создает фактор). Для создания тестовой (макетной) реализации вашей тестовой среды потребуется собственный механизм фабрики. –

+1

@AlexSpangher - Да, Apache Tomcat использует собственную реализацию HttpServletRequest. На самом деле несколько - вот один пример: http://tomcat.apache.org/tomcat-5.5-doc/catalina/docs/api/org/apache/catalina/connector/Request.html – lreeder

Смежные вопросы