我正在运行一些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)
由服务器正确解释和实现吗?
答案 0 :(得分:4)
像Oracle或Apache这样的容器实现者使用他们自己的实现来扩展HttpServletRequest接口。你可以为你的测试做同样的事情,或者用Mockito之类的东西来模仿它。
您应该提供HttpServletRequest实现的唯一时间是在单元测试时,而不是在代码在servlet容器中运行时。容器将为您传递自己的HttpServletRequest,您的代码不应该关心该接口的确切实现。它应该只使用HttpServletRequest接口提供的方法,以便它独立于它运行的容器。
如果您需要测试代码在servlet容器中运行时的行为,您可以进行手动测试,或者使用发出HTTP请求的测试框架,例如HttpUnit
答案 1 :(得分:0)
Spring用户可以使用MockHttpServletRequest
(JavaDoc)类