2

我正在运行一些需要将 HTTPServletRequest 作为参数传入的 Scala 代码(使用 Java socialAuth 库)。

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 作为参数时,通常会传入什么实现类?


FOLLOWUP:根据给出的答案,不同服务器实现的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() 时,它的代码是如何调整的?(抱歉,我对此有点陌生,所以请多多包涵……)如果val mockRequest需要使用服务器(Apache、Oracle 等)使用的任何 HttpServletRequest 实现来实现,用户如何在其中指定otherClass?会发生这样的变化:

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

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

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

4

2 回答 2

4

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

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

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

于 2013-08-05T20:19:06.993 回答
3

Spring 用户可以使用该类MockHttpServletRequestJavaDoc

于 2019-01-28T12:19:17.923 回答