如何测试需要通过HTTPServletRequest的代码

时间:2013-08-05 20:16:26

标签: java scala servlets

我正在运行一些Scala代码(使用Java socialAuth库),需要将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是一个接口,这意味着它无法单独实例化。如何在代码中使用?

编辑:在一个方法将HttpServletRequest作为参数时,通常传入什么实现类?


关注:基于给出的答案,HttpServletRequest由不同的服务器实现不同;例如,Ireeder指出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()时,它的代码是如何调整的? (对不起,我对此有点新意,所以请耐心等待......)如果需要使用服务器使用的HttpServletRequest实现(Apache,Oracle等)来实现val mockRequest,那么用户在otherClass中指定此内容?这样的事情会改变吗?

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

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

由服务器正确解释和实现吗?

2 个答案:

答案 0 :(得分:4)

像Oracle或Apache这样的容器实现者使用他们自己的实现来扩展HttpServletRequest接口。你可以为你的测试做同样的事情,或者用Mockito之类的东西来模仿它。

您应该提供HttpServletRequest实现的唯一时间是在单元测试时,而不是在代码在servlet容器中运行时。容器将为您传递自己的HttpServletRequest,您的代码不应该关心该接口的确切实现。它应该只使用HttpServletRequest接口提供的方法,以便它独立于它运行的容器。

如果您需要测试代码在servlet容器中运行时的行为,您可以进行手动测试,或者使用发出HTTP请求的测试框架,例如HttpUnit

答案 1 :(得分:0)

Spring用户可以使用MockHttpServletRequestJavaDoc)类