在春季测试中请求范围内的bean

2023-12-29

我想在我的应用程序中使用请求范围的 bean。我使用 JUnit4 进行测试。如果我尝试在这样的测试中创建一个:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/TestScopedBeans-context.xml" })
public class TestScopedBeans {
    protected final static Logger logger = Logger
            .getLogger(TestScopedBeans.class);

    @Resource
    private Object tObj;

    @Test
    public void testBean() {
        logger.debug(tObj);
    }

    @Test
    public void testBean2() {
        logger.debug(tObj);
    }

具有以下 bean 定义:

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean class="java.lang.Object" id="tObj" scope="request" />
 </beans>           

我得到:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gov.nasa.arc.cx.sor.query.TestScopedBeans': Injection of resource fields failed; nested exception is java.lang.IllegalStateException: No Scope registered for scope 'request'
<...SNIP...>
Caused by: java.lang.IllegalStateException: No Scope registered for scope 'request'

所以我发现这个博客似乎很有帮助:http://www.javathinking.com/2009/06/no-scope-registered-for-scope-request_5.html http://www.javathinking.com/2009/06/no-scope-registered-for-scope-request_5.html

但我注意到他使用抽象依赖注入SpringContextTests http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/test/AbstractDependencyInjectionSpringContextTests.html这似乎在 Spring 3.0 中已被弃用。 我此时使用 Spring 2.5,但认为切换此方法以使用 AbstractJUnit4SpringContextTests 应该不会太难 正如文档建议的那样(好的文档链接到 3.8 版本,但我正在使用 4.4)。所以我改变了 测试扩展 AbstractJUnit4SpringContextTests...相同的消息。同样的问题。现在我想要的prepareTestInstance()方法 未定义覆盖。好吧,也许我会把这些 registerScope 调用放在其他地方......所以我阅读了更多关于测试执行监听器 http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/test/context/TestExecutionListeners.html并认为这会更好,因为我不想继承 spring 包结构。所以 我将测试更改为:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/TestScopedBeans-context.xml" })
@TestExecutionListeners({})
public class TestScopedBeans {

期望我必须创建一个自定义侦听器,但当我运行它时。有用!太好了,但是为什么呢?我看不到任何库存听众在哪里 正在注册请求范围或会话范围,为什么要注册?没什么可说的,我想要这个,这可能不是 Spring MVC 代码的测试......


Spring 3.2 或更高版本的解决方案

Spring 从 3.2 版本开始为集成测试的会话/请求作用域 bean 提供支持 https://jira.spring.io/browse/SPR-4588.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
@WebAppConfiguration
public class SampleTest {

    @Autowired WebApplicationContext wac;

    @Autowired MockHttpServletRequest request;

    @Autowired MockHttpSession session;    

    @Autowired MySessionBean mySessionBean;

    @Autowired MyRequestBean myRequestBean;

    @Test
    public void requestScope() throws Exception {
        assertThat(myRequestBean)
           .isSameAs(request.getAttribute("myRequestBean"));
        assertThat(myRequestBean)
           .isSameAs(wac.getBean("myRequestBean", MyRequestBean.class));
    }

    @Test
    public void sessionScope() throws Exception {
        assertThat(mySessionBean)
           .isSameAs(session.getAttribute("mySessionBean"));
        assertThat(mySessionBean)
           .isSameAs(wac.getBean("mySessionBean", MySessionBean.class));
    }
}

阅读更多:请求和会话范围的 Bean http://spring.io/blog/2012/11/07/spring-framework-3-2-rc1-new-testing-features/#request-and-session-scoped-beans


Spring 3.2之前带监听器的解决方案

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
@TestExecutionListeners({WebContextTestExecutionListener.class,
        DependencyInjectionTestExecutionListener.class,
        DirtiesContextTestExecutionListener.class})
public class SampleTest {
    ...
}

WebContextTestExecutionListener.java

public  class WebContextTestExecutionListener extends AbstractTestExecutionListener {
    @Override
    public void prepareTestInstance(TestContext testContext) {
        if (testContext.getApplicationContext() instanceof GenericApplicationContext) {
            GenericApplicationContext context = (GenericApplicationContext) testContext.getApplicationContext();
            ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
            beanFactory.registerScope(WebApplicationContext.SCOPE_REQUEST,
                    new SimpleThreadScope());
            beanFactory.registerScope(WebApplicationContext.SCOPE_SESSION,
                    new SimpleThreadScope());
        }
    }
}

Spring 3.2之前的自定义作用域的解决方案

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class, locations = "test-config.xml")
public class SampleTest {

...

}

TestConfig.java

@Configuration
@ComponentScan(...)
public class TestConfig {

    @Bean
    public CustomScopeConfigurer customScopeConfigurer(){
        CustomScopeConfigurer scopeConfigurer = new CustomScopeConfigurer();

        HashMap<String, Object> scopes = new HashMap<String, Object>();
        scopes.put(WebApplicationContext.SCOPE_REQUEST,
                new SimpleThreadScope());
        scopes.put(WebApplicationContext.SCOPE_SESSION,
                new SimpleThreadScope());
        scopeConfigurer.setScopes(scopes);

        return scopeConfigurer

}

或使用 xml 配置

test-config.xml

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="request">
                <bean class="org.springframework.context.support.SimpleThreadScope"/>
            </entry>
        </map>
        <map>
            <entry key="session">
                <bean class="org.springframework.context.support.SimpleThreadScope"/>
            </entry>
        </map>
    </property>
</bean>

源代码

所有提出的解决方案的源代码:

  • https://github.com/mariuszs/spring-test-web https://github.com/mariuszs/spring-test-web
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在春季测试中请求范围内的bean 的相关文章

  • Java 读取大文本文件时出现 OutOfMemoryError

    我是 Java 新手 正在读取非常大的文件 需要一些帮助来理解问题并解决它 我们有一些遗留代码 必须对其进行优化才能正常运行 文件大小仅在 10mb 到 10gb 之间变化 只有当文件开始大小超过 800mb 时才会出现启动问题 Input
  • 在命令行java中突出显示文本[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一项任务是重新创建 unix cal 程序 除了一部分之外 相当简单 今天 它突出显示了该数字 我不知道该怎么做 关于如何在 Ja
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • 如何为小程序提供对文件系统写入的访问权限

    我在设置小程序的策略文件时遇到问题 我是第一次这样做 不知道如何在java中设置小程序的策略文件 实际上我想授予小程序在文件系统上写入的权限 为此我必须向小程序授予文件权限 所以我创建了一个名为 java policy 的文件 并将以下代码
  • 具有 CRUD 功能的基于 Spring Web 的管理工具

    在 PHP Symfony 世界里有一个工具叫 Sonata Adminhttps sonata project org https sonata project org 基于 AdminLTE 模板 这是一款一体化管理工具 具有登录 菜单
  • OpenNLP 与斯坦福 CoreNLP

    我一直在对这两个包进行一些比较 但不确定该往哪个方向走 我简单地寻找的是 命名实体识别 人 地点 组织等 性别识别 一个不错的训练 API 据我所知 OpenNLP 和斯坦福 CoreNLP 提供了非常相似的功能 然而 Stanford C
  • 在 Junit 测试中使用 ReflectionTestUtils.setField()

    我是 JUnittesting 的新手 所以我有一个问题 谁能告诉我为什么我们使用ReflectionTestUtils setField 在我们的 Junit 测试示例中 正如评论中提到的 java 文档很好地解释了用法 但我还想给你们举
  • 关于Java泛型的一些问题

    假设我有以下接口和实现类 interface Foo
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • 在spring data jpa中实现动态数据源

    我有 N 个服务器 N 个数据库和 N 个配置 看下面的场景 因此 对于每个请求 我都需要根据配置访问服务器和数据库 spring data jpa如何实现动态数据源 你可以试试抽象路由数据源 https docs spring io sp
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • 合并两个地图的最佳实践是什么

    如何将新地图添加到现有地图 地图具有相同的类型Map
  • 如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

    我对 javax validation API 感到困惑 我正在编写一个简单的测试来理解它 Sample sample new Sample Set
  • 使用 HTTPServletRequestWrapper 包装请求参数

    我有一个可以验证 授权 REST 调用的过滤器 该过滤器需要访问请求参数 因此我为此编写了一个自定义 HTTPServletRequestWrapper import java util Collections import java ut
  • Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

    我对 mortbay 的 Maven jetty 插件 6 有相同的配置
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • Java 中处理异步响应的设计模式

    我读过类似问答的答案 如何在 JAVA 中创建异步 HTTP 请求 https stackoverflow com questions 3142915 how do you create an asynchronous http reque
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径

随机推荐

  • 在通用故事板中使用当前作为弹出框

    Apple 建议针对不同尺寸类别的通用应用程序使用单一情节提要 现在我正在尝试根据设备调整 UI 到目前为止效果很好 我面临的唯一问题是如何分配特定的segues 例如 我的应用程序中的设置仅包含两个表格视图单元格 应该通过 iPad 上的
  • C++ 按值获取数组元素的索引

    到目前为止 我一直将数组存储在向量中 然后循环遍历向量以查找匹配元素 然后返回索引 在 C 中是否有更快的方法来做到这一点 我用来存储数组的 STL 结构对我来说并不重要 它不必是向量 我的数组也是唯一的 没有重复元素 并且是有序的 例如
  • 菜单项不会出现在 Google 表格插件中

    我正在尝试制作这个附加插件 可以帮助我和其他人将工作表导出为 JSON 在我的测试中 菜单显示并且所有功能都有效 如屏幕截图中所示 当我发送到 Google Web Store 上发布时 Docs Add ons Advisor 在评论中看
  • ui-router:基于用户角色的默认路由

    我在我的项目中使用 UI 路由器 我的应用程序的主页由 4 个选项卡组成 每个选项卡路由到不同的模板 这是我当前的路由代码 我使用 forEach 创建 6 个路由 Draft Assigned InProgress Completed R
  • Xcode、Swift:如何在 iOS 应用程序中添加多语言支持并使用带有占位符和复数的字符串?

    我需要在使用 Swift 在 Xcode 中编写的 iOS 应用程序中添加多语言支持 我需要本地化 静态字符串 带有占位符的字符串 复数 数量字符串 例如下面在 Android 中我们在 XML 文件中添加命名字符串和复数
  • 如何使用 PDFbox 创建固定宽度的段落?

    我可以插入这样的简单文本 document new PDDocument page new PDPage PDPage PAGE SIZE A4 document addPage page PDPageContentStream conte
  • Kivy:如何使用canvas来创建在python中创建的小部件

    我想向我的复选框添加画布以更改其颜色 我找到了这个answer https stackoverflow com a 37072458 3154274 但我正在努力实施它 我的复选框是使用以下代码在 python 中创建的 checkb Ch
  • Java 比较两个字符串与占位符值

    我正在为 Java 项目开发基于命令的功能 但在向这些命令引入参数时遇到了麻烦 例如 所有命令的存储方式如下 Hey tell USER to ACTION 现在 当用户提交命令时 它将如下所示 Hey tell Player to com
  • 如何抑制 Swift 3 中的警告?

    使用 clang 我可以做 pragma clang diagnostic push pragma clang diagnostic ignored Wdeprecated declarations pragma clang diagnos
  • WPF 中的命中测试

    我有一个Ellipse on a Canvas我正在对其进行命中测试 每次我点击Ellipse 测试通过 如果我点击中间Ellipse 测试失败 这很好 在我像这样填充椭圆之后 myEllipse Fill new SolidColorBr
  • OAuth2(不支持的授权类型)无效的授权类型:client_credentials

    我正在尝试获取 Google Drive API 的访问令牌 以便将其用于来自我的 Python 脚本的后续请求 但是我收到了一个无效的 grant type 错误 这有点令人困惑 我在用oauthlib and requests oaut
  • 如何增加文本小部件中的字体大小?

    当我使用以下代码增加字体大小时 它也会增加小部件的大小 是否可以通过保持文本小部件的大小不变来增加字体大小 谢谢 A11 tkinter Text top height 28 width 70 background 02e0a1 label
  • 使用 iTextSharp 禁用扩展功能

    我有一个 PDF 模板 其中包含启用了扩展功能的表单 填写此表格的字段后 使用iTextSharp 使用 acrobat reader 的用户收到错误消息 本文档启用了 Adob e Reader 中的扩展功能 该文件有 自创建以来已发生更
  • 如何将 jekyll _site 目录推送到 gh-pages 分支,并将源代码保留在 master 中?

    我有一个基本的 jekyll 网站 由页面 不是帖子 组成 但是 因为我想在列出页面时对页面进行排序 所以我必须使用杰基尔排序 https github com krazykylep Jekyll Sort插件 jekyll 中没有内置有点
  • IE - JQuery 在 $.each 循环中将子节点附加到 XML

    我遇到了 IE 无法正确附加或识别我将子节点附加到解析的 XML 字符串的尝试的问题 Chrome 和 Firefox 明白我正在尝试做什么 我不知道这是范围问题还是 IE 和 XML 的行为 var dataContainers data
  • 使用 Delicious API 在 Firefox 中创建 Delicious 书签

    我想在 Firefox 中创建一个 Delicious 小书签 用预定义的标签为当前页面添加书签 为了概念证明 如果我输入此网址 它会起作用 https john email protected cdn cgi l email protec
  • 端口和套接字之间的混淆

    好吧 当我尝试研究 IP 地址 端口和套接字时 我得到了以下结果 IP 地址用于映射到网络上的不同设备 端口号用于访问主机上的特定应用程序 套接字是两者的组合 我不明白的是 如果端口将您连接到特定应用程序 那么每个应用程序应该只有 1 个端
  • 如何在 Linux 中使用 objdump 和 bash 函数在共享对象文件中查找函数?

    我在linux中有一个文件夹 其中包含几个共享对象文件 so 如何在 Linux 中使用 objdump 和 bash 函数在共享对象文件中查找函数 例如下面的例子是find me函数func1在 mylib so 中 objdump d
  • .gitignore 不忽略文件夹

    我在 Laravel 中有一个项目 并且在公共目录中有一个论坛 我不想将其推送到存储库 所以我在 gitignore 中写入 Laravel vendor node modules Laravel 5 Lumen specific boot
  • 在春季测试中请求范围内的bean

    我想在我的应用程序中使用请求范围的 bean 我使用 JUnit4 进行测试 如果我尝试在这样的测试中创建一个 RunWith SpringJUnit4ClassRunner class ContextConfiguration locat