当前位置: 首页 > 知识库问答 >
问题:

Spring静态上下文访问器和集成测试

严正诚
2023-03-14

我们有一个spring组件,它将应用程序上下文设置为一个静态字段。然后从应用程序的其他部分访问该静态字段。我知道不应该使用static,但有时需要从非spring管理的bean访问spring上下文。例如。字段如下所示:

public class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContext context;

    public ApplicationContext getApplicationContext() {
        return context;
    }

    @Override
    public void setApplicationContext(ApplicationContext ctx) {
        context = ctx;
    }
}

(取自http://www.dcalabrise.com/blog/java/spring-context-static-class/)

问题在于,当在集成测试中使用JUnit(或Spock)框架时,将为具有诸如@TestPropertySource@ContextConfiguration之类注释的测试创建一个新的spring上下文,在这种情况下,将为具有相同配置的其他测试缓存上下文(spring test framework中的上下文缓存)。

结果是,测试的一部分在一个spring上下文中运行,从访问静态字段开始,它在另一个上下文中运行。

有人有解决这个问题的办法吗?有人遇到同样的情况吗?

共有1个答案

龙成仁
2023-03-14

我也面临过同样的问题。可能的解决方案可能是在测试之前保存上下文,然后恢复它。对于集合性,可以通过junit规则进行:

public class ContextRestoreRule extends ExternalResource {

    private ApplicationContext context;

    @Override
    protected void before() throws Throwable {
        context = ApplicationContextProvider.getContext();
    }

    @Override
    protected void after() {
        ApplicationContextProvider.setContext(context);
    }
}

在测试中(wich修改上下文):

@ClassRule
public static ContextRestoreRule contextRestore = new ContextRestoreRule();
 类似资料:
  • 问题内容: 我有一群学生。首先,我想按标记对它们进行分组。然后,我想进一步将这些集合归为同名学生。 我收到一个错误消息, 非静态方法不能从静态上下文中引用。 是。我非常清楚,没有实例就无法引用非静态方法。但是,对于所有这些流操作,我对真正出了什么问题感到有些困惑。 而不是如何解决这个问题;我真的很想知道这是怎么回事。您的任何意见表示赞赏! 因为如果我写下面的分组是完全有效的; 这是我的Studen

  • 根据JLS §8.1.3,为什么Java不允许在内部类中建立静态上下文?

  • 我有一个Spring Boot应用程序(2.2.6.release),它使用ReactJs作为前端库。我在application.properties中配置了自定义上下文路径和spring.mvc属性,如下所示: Webpack用于将bundles和index.html构建到src/main/resources/static/dist中。下面是项目结构的样子: 我需要能够从

  • 我试图将Stormpath登录工作流添加到我的Spring Boot应用程序中,该应用程序在/api上下文中运行,该上下文在我的application.properties中定义为server.context-path=/api。 当我访问一个受限路径时,我会得到Stormpath登录页面,其中包含一个“Next”请求参数http://localhost:8080/api/login?next=%

  • 需要对Oauth2客户端的集成测试的帮助。 设置: 具有受保护UI和API的客户端 完成所有密码验证并检索访问令牌的身份验证服务器 集成测试: 放心用于终点测试 在实现Oauth2之前,测试工作良好 Ole测试示例: 问题: 如何使此测试再次工作? 应如何更改res-assured设置以支持OAuth2? 是否需要模拟身份验证服务器,或者是否可以注入/mock安全上下文?

  • 我写了一些相关的代码,使用Spring上传文件,它工作正常,现在我正在为此编写联调案例,但我面临一些问题我的控制器方法, 测试用例 但我正在 我哪里错了?