使用Spring 3.1.x和MockMvc模拟/自动装配bean - java

我正在使用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 - java

private 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数组,因此您需要从数据库中获取此数组。