Alex Spangher
Alex Spangher

Reputation: 997

How to test code that needs passed HTTPServletRequest

I'm running some Scala code (with Java socialAuth library) that requires an HTTPServletRequest to be passed in as a param.

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

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

    //code continues...

}

So the HttpServletRequest seems like a really cool way of storing session variables and passing a session between methods. However, I'm not quite sure how to test this code, as I don't really understand what the HttpServletRequest interface is.

I've done a bit of research, but I was wondering if anyone could clarify for me. HttpServletRequest is an interface, which means it can't be instantiated on its own. How, then is it used in code?

EDIT: as in, when a method takes an HttpServletRequest as a parameter, what implementing class is usually passed in?


FOLLOWUP: Based on the answers given, HttpServletRequest is implemented differently by different servers; Ireeder pointed out, for example, that Apache even has multiple implementations. How, then, does code specify that the server needs to use its implementation? In other words, lets say I have test code that uses 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)
    }

I assume this is OK for testing, as Mockito creates a mock object, but when otherClass() needs to be implemented on a server, how is its code adjusted? (Sorry, I'm a bit new at this, so bear with me...) If val mockRequest needs to be implemented with whatever HttpServletRequest implementation is used by the server (Apache, Oracle, etc), how does the user specify this in otherClass? Will something like this change:

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

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

be interpreted and implemented correctly by the server?

Upvotes: 3

Views: 8251

Answers (2)

Terran
Terran

Reputation: 1153

Spring users can use the class MockHttpServletRequest (JavaDoc)

Upvotes: 4

lreeder
lreeder

Reputation: 12206

Container implementers like Oracle or Apache extend the HttpServletRequest interface with their own implementations that actually do something. You could do the same for your testing, or use something like Mockito to mock it.

The only time you should be providing an implementation of an HttpServletRequest is at unit testing time, not when your code is running in a servlet container. The container will pass you its own HttpServletRequest, and your code should not care about the exact implementation of that interface. It should only use the methods provided by the HttpServletRequest interface so that it is independent of the container it is running in.

If you need to test the behavior of your code when it's running in servlet container, you can do manual testing, or use a testing framework that makes HTTP requests, like HttpUnit

Upvotes: 5

Related Questions