gpt4 book ai didi

java - 使用 Spring 3.1.x 和 MockMvc 模拟/ Autowiring bean

转载 作者:行者123 更新时间:2023-12-02 18:23:26 29 4
gpt4 key购买 nike

我正在使用 Spring 3.1.4,并尝试使用 MockMvc 围绕我们的身份验证编写一些集成测试。

我遇到的根本问题之一是,因为我没有使用 Spring 3.2,所以我无法在测试中使用 @Autowire WebApplicationContext 对象,因此无法使用 MockMvcBuilders.webApplicationContextSetup(),因此我改用 xmlConfigSetup

我似乎走上了一条有多个岔路的道路,但都没有解决我的所有问题。

我的配置如下:

@ContextConfiguration(locations = {
"classpath:/test-applicationContext.security.xml",
"classpath:/test-mvc-dispatcher-servlet.xml"
})
@RunWith(SpringJUnit4ClassRunner.class)
public class SecurityTests extends AbstractJUnit4SpringContextTests {

public static final String[] CONTEXT_CONFIG = {
"classpath:/test-applicationContext.security.xml", "classpath:/test-mvc-dispatcher-servlet.xml"
};

@Autowired
private Filter springSecurityFilterChain;

@Before
public void setUp() {
ContextMockMvcBuilder xmlConfigSetup = MockMvcBuilders.xmlConfigSetup(CONTEXT_CONFIG);
this.mockMvc = xmlConfigSetup.addFilters(springSecurityFilterChain).build();
}

这里的优点是我的springSecurityFilterChain@Autowired,可以轻松提供给addFilters() >。 缺点是任何其他 Autowiring 的 bean 都是与我的 MockMvc 配置中的实例不同的实例,因为我实际上构建了两次 servlet 上下文。这意味着,如果我 Autowiring UserDetailsS​​ervice 并在集成测试中对其进行调整(添加用户“bob”),则 MockMvc 实例没有它。

选项 1:使用上述配置,我可以访问 MockMvc 实例内的任何 bean 吗?我还没有找到一种方法,使“准备”任何集成测试变得不可能。

选项 2:删除@ContextConfiguration,只让 MockMvc 驱动测试。这看起来更干净,但我不知道如何创建/注入(inject) Spring Security 过滤器链 - 因为它不再自动连接。 (没有我的bean - 这使得访问其他关键bean(例如UserDetailsS​​ervice)也有问题。)

选项 3: 我可以手动配置一个 WebApplicationContext 来包装 AbstractJUnit4SpringContextTests 父类(super class)中的 applicationContext ,并将this提供给MockMvcBuilders.webApplicationContextSetup()方法?这样做的优点是不需要两个单独的 servlet 上下文,但当我真的没有一个时,手动构建它似乎特别麻烦 - 而且我也不知道如何将 Spring Security 过滤器链集成到其中。

我正在寻求有关上述选项中哪些(如果有)最可行以及如何实现它们的建议。

不幸的是,无法升级到较新版本的 Spring。

最佳答案

This post Spring 团队提出了一种将 WebApplicationContext 注入(inject) JUnit 测试的方法。除了指定配置位置之外,他们还使用专门为运行集成测试而实现的自定义上下文加载器。问题在于,它们的上下文加载器依赖于任何 Spring 存储库中不再可用的类。然而,它可以源自 Spring MVC Test Samples 中的一些.

Step 1: Create a custom context loader

class TestWebContextLoader extends AbstractContextLoader { ... }

此上下文加载器将用于加载 Spring 配置文件。

Step 2: Use the custom loader to load the Spring configuration files.

改变

@ContextConfiguration(locations = {
"classpath:/test-applicationContext.security.xml",
"classpath:/test-mvc-dispatcher-servlet.xml" })

@ContextConfiguration(loader = TestWebContextLoader.class,
locations = {
"classpath:/test-applicationContext.security.xml",
"classpath:/test-mvc-dispatcher-servlet.xml" })

Step 3: Inject WebApplicationContext into your JUnit tests

public class SecurityTests extends AbstractJUnit4SpringContextTests {
@Autowired
private WebApplicationContext webApplicationContext;
}

Step 4: Build a mock using the injected WebApplicationContext

public class SecurityTests extends AbstractJUnit4SpringContextTests {
@Autowired
private WebApplicationContext webApplicationContext;

@Before
public void setUp() {
MockMvc mock = MockMvcBuilders.webApplicationContextSetup(webApplicationContext).build();
}
}
<小时/>

我创建了a sample application这演示了概念以及上下文成功加载的位置。

关于java - 使用 Spring 3.1.x 和 MockMvc 模拟/ Autowiring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35588023/

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