单元测试依赖于请求上下文的方法

sat*_*shi 54 spring spring-mvc

我正在为包含以下行的方法编写单元测试:

String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

java.lang.IllegalStateException:找不到线程绑定请求:您是指实际Web请求之外的请求属性,还是处理最初接收线程之外的请求?如果您实际在Web请求中操作并仍然收到此消息,则您的代码可能在DispatcherServlet/DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter来公开当前请求.

原因很明显 - 我没有在请求上下文中运行测试.

问题是,如何在测试环境中测试包含对依赖于请求上下文的方法的调用的方法?

非常感谢你.

pap*_*pap 163

Spring-test有一个名为MockHttpServletRequest的灵活请求模拟.

MockHttpServletRequest request = new MockHttpServletRequest();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
Run Code Online (Sandbox Code Playgroud)

  • 同意@Eugene. (2认同)

nic*_*ild 40

您可以模拟/存根RequestAttributes对象以返回您想要的内容,然后RequestContextHolder.setRequestAttributes(RequestAttributes)在开始测试之前使用您的模拟/存根调用.

@Mock
private RequestAttributes attrs;

@Before
public void before() {
    MockitoAnnotations.initMocks(this);
    RequestContextHolder.setRequestAttributes(attrs);

    // do you when's on attrs
}

@Test
public void testIt() {
    // do your test...
}
Run Code Online (Sandbox Code Playgroud)


Maa*_*eeb 8

我能够做与这个答案相同的事情,但没有MockHttpServletRequest使用@Mock注释的班级。我猜他们很相似。只是张贴在这里为未来的访客。

@Mock
HttpServletRequest request;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
}
Run Code Online (Sandbox Code Playgroud)