gpt4 book ai didi

java - 使用 spring 进行 JUnit 测试

转载 作者:行者123 更新时间:2023-12-04 06:13:20 26 4
gpt4 key购买 nike

我正在尝试为 spring Controller 方法创建一个 junit 测试,但我一直收到以下错误

java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, 
or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message,
your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:123)

我已经添加了它告诉我我需要的两个东西(我已经分别尝试了每一个),目前我的 web.xml 包含
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

我试图测试的方法类似于
@Controller
@RemotingDestination
public class MyController {

public Response foo()
{
//...
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpSession httpSession = attr.getRequest().getSession(true);
//...
}

我的 junit 测试只是调用 myController.foo() 并检查响应。所以我不能创建一个模拟对象来传递给方法来解决这个问题。

所以我想我的问题是,是否存在一些我尚未偶然发现的配置或技巧,可以使此运行而无需重构我的 Controller 方法?

最佳答案

错误信息非常清楚。不幸的是,您的代码需要进行一些重写。

首先,在测试您的 Controller 时,您(显然)不在网络请求中。这就是为什么RequestContextHolder.currentRequestAttributes()不起作用。但是您可以使用以下技术使您的测试通过并重构代码以提高可读性(假设您需要一个 HTTP session 来从中获取一些实际属性):

public Response foo(@SessionAttribute("someSessionAttribute") int id)

这样 Spring MVC 将自动获取 session 并加载 someSessionAttribute在 Web 请求中时(甚至执行所需的转换)。但是当你在测试 Controller 时,只需调用带有固定参数的方法即可。没有请求/ session 基础结构代码。更干净(请注意,您提供的 foo 中的两行根本不需要)。

另一种解决方案是注册 RequestScope手动。查看示例 here .这应该可以在不使用模拟请求和 session 修改任何代码的情况下工作。

关于java - 使用 spring 进行 JUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7525776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com