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

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从手动包装applicationContextAbstractJUnit4SpringContextTests父类,并提供MockMvcBuilders.webApplicationContextSetup()的方法?这样做的好处是不需要两个单独的servlet上下文,但是当我没有这个上下文时,手动构建它似乎特别容易 - 而且我不确定如何将Spring Security过滤器链集成到这个中.

我正在寻找关于哪些(如果有的话)上述选项最可行的建议,以及如何完成它们.

不幸的是,升级到更新版本的Spring不是一个选择.

man*_*ish 6

来自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)

我创建了一个示例应用程序,演示了概念以及上下文成功加载的位置.