Cra*_*tis 2 java spring mocking spring-mvc spring-security
我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)
这里的优点是我springSecurityFilterChain的@Autowired,易于提供addFilters().的缺点是,任何其他自动装配豆是不同的情况下比我MockMvc配置的,因为我基本上是建设我servlet上下文的两倍.这意味着如果我UserDetailsService在集成测试中自动调整并调整它(添加用户"bob"),则MockMvc实例没有它.
选项1:使用上面的配置,我可以访问MockMvc实例中的任何bean吗?我还没有找到一种方法,这使得任何集成测试都无法"准备".
选项2:删除@ContextConfiguration并让MockMvc驱动测试.这看起来更干净,但我无法弄清楚如何创建/注入Spring Security过滤器链 - 因为它不再是自动装配的.(我的bean都没有 - 这使得访问其他关键bean也有UserDetailsService问题.)
方案3:我可以搭起一个WebApplicationContext从手动包装applicationContext在AbstractJUnit4SpringContextTests父类,并提供该给MockMvcBuilders.webApplicationContextSetup()的方法?这样做的好处是不需要两个单独的servlet上下文,但是当我没有这个上下文时,手动构建它似乎特别容易 - 而且我不确定如何将Spring Security过滤器链集成到这个中.
我正在寻找关于哪些(如果有的话)上述选项最可行的建议,以及如何完成它们.
不幸的是,升级到更新版本的Spring不是一个选择.
来自Spring团队的这篇文章提出了一种注入WebApplicationContextJUnit测试的方法.除了指定配置位置外,它们还使用专门用于运行集成测试的自定义上下文加载器.问题是它们的上下文加载器依赖于任何Spring存储库中不再可用的类.但是,它可以从一些Spring MVC测试样本中获得.
第1步:创建自定义上下文加载器
class TestWebContextLoader extends AbstractContextLoader { ... }
Run Code Online (Sandbox Code Playgroud)
此上下文加载器将用于加载Spring配置文件.
第2步:使用自定义加载程序加载Spring配置文件.
更改
@ContextConfiguration(locations = {
"classpath:/test-applicationContext.security.xml",
"classpath:/test-mvc-dispatcher-servlet.xml" })
Run Code Online (Sandbox Code Playgroud)
至
@ContextConfiguration(loader = TestWebContextLoader.class,
locations = {
"classpath:/test-applicationContext.security.xml",
"classpath:/test-mvc-dispatcher-servlet.xml" })
Run Code Online (Sandbox Code Playgroud)
第3步:注入
WebApplicationContextJUnit测试
public class SecurityTests extends AbstractJUnit4SpringContextTests {
@Autowired
private WebApplicationContext webApplicationContext;
}
Run Code Online (Sandbox Code Playgroud)
第4步:使用注入的方法构建模拟
WebApplicationContext
public class SecurityTests extends AbstractJUnit4SpringContextTests {
@Autowired
private WebApplicationContext webApplicationContext;
@Before
public void setUp() {
MockMvc mock = MockMvcBuilders.webApplicationContextSetup(webApplicationContext).build();
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个示例应用程序,演示了概念以及上下文成功加载的位置.
| 归档时间: |
|
| 查看次数: |
1275 次 |
| 最近记录: |