我正在使用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()
。缺点是,任何其他自动装配的Bean与MockMvc配置中的实例都是不同的实例,因为我实际上是在两次构造Servlet上下文。这意味着,如果我自动连接UserDetailsService
并在集成测试中对其进行调整(添加用户“ bob”),则MockMvc实例将没有它。
选项1:使用上述配置,我可以访问MockMvc实例内的任何bean吗?我还没有找到一种方法,这使得不可能为任何集成测试做“准备”。
选项2:删除@ContextConfiguration
,然后让MockMvc驱动测试。这看起来比较干净,但是我不知道如何创建/注入Spring Security过滤器链-因为它不再自动装配。 (我的所有bean都不是-这也使得访问其他重要的bean(例如UserDetailsService
也有问题)。)
选项3:我是否可以手动组装一个从WebApplicationContext
超类中的applicationContext
包装的AbstractJUnit4SpringContextTests
,并将其提供给MockMvcBuilders.webApplicationContextSetup()
方法?这具有不需要两个单独的servlet上下文的优点,但是当我没有一个servlet上下文时,手动构建它似乎特别棘手-而且我不确定如何将Spring Security过滤器链集成到其中。
我正在寻找上述选项中最可行的建议,以及如何实现这些建议。
不幸的是,没有选择升级到较新版本的Spring。
java大神给出的解决方案
Spring团队的This post提出了一种将WebApplicationContext
注入到JUnit测试中的方法。除了指定配置位置之外,他们还使用专门为运行集成测试而实现的自定义上下文加载器。问题在于他们的上下文加载器依赖于任何Spring存储库中不再可用的类。但是,它可以从某些Spring MVC Test Samples派生。
步骤1:创建自定义上下文加载器
class TestWebContextLoader extends AbstractContextLoader { ... }
该上下文加载器将用于加载您的Spring配置文件。
步骤2:使用自定义加载器加载Spring配置文件。
更改
@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" })
步骤3:将WebApplicationContext
注入到JUnit测试中
public class SecurityTests extends AbstractJUnit4SpringContextTests {
@Autowired
private WebApplicationContext webApplicationContext;
}
步骤4:使用注入的WebApplicationContext
构建模拟
public class SecurityTests extends AbstractJUnit4SpringContextTests {
@Autowired
private WebApplicationContext webApplicationContext;
@Before
public void setUp() {
MockMvc mock = MockMvcBuilders.webApplicationContextSetup(webApplicationContext).build();
}
}
我创建了a sample application来演示概念以及上下文成功加载的位置。
java:继承 - java有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…
Java-如何将此字符串转换为日期? - java我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…
Spring MVC:如何获取请求的处理程序方法 - java我正在尝试根据Spring @RequestMapping注释方法上存在的注释实现一些逻辑。因此,我的方法中有一个HttpServletRequest实例,我想问一下spring“给我一个方法,该方法将被调用以处理此请求”,因此我可以使用反射API来询问是否存在我的注释,因此我可以更改处理。有什么简单的方法可以从Spring MVC获取此信息? java大神…
从方法返回数组-Java - javaprivate static Coordinate[] getCircleCoordintaes() { Coordinate coordinates[] = {new Coordinate(0, 0)}; return coordinates; } 以上程序工作正常。在上面的程序中,返回的坐标数组首先初始化了数组使用这条线Coordinate coordi…
Java Swing SearchBox模型 - java我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。