簡體   English   中英

使用Spring 3.1.x和MockMvc模擬/自動裝配bean

[英]Mocking/autowiring beans with Spring 3.1.x and MockMvc

我正在使用Spring 3.1.4,並嘗試圍繞我們的MockMvc身份驗證編寫一些集成測試。

我遇到的根本問題之一是因為我沒有使用Spring 3.2,所以無法在測試中@Autowire WebApplicationContext對象,因此無法使用MockMvcBuilders.webApplicationContextSetup() ,所以我m改用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過濾器鏈-因為它不再自動裝配。 (我的豆子都不是-這使得訪問其它關鍵豆像UserDetailsService問題也是如此。)

選項3:我可以鑽機了WebApplicationContext手動從包裝applicationContextAbstractJUnit4SpringContextTests超類,並將提供給所述MockMvcBuilders.webApplicationContextSetup()方法? 這具有不需要兩個單獨的servlet上下文的優點,但是當我沒有一個servlet上下文時,手動構建它似乎特別棘手-而且我不確定如何將Spring Security過濾器鏈集成到其中。

我正在尋找有關上述選項中最可行的建議,以及如何實現這些建議。

不幸的是,沒有選擇升級到較新版本的Spring。

Spring團隊的這篇帖子提出了一種將WebApplicationContext注入到JUnit測試中的方法。 他們除了指定配置位置之外,還使用了專門為運行集成測試而實現的自定義上下文加載器。 問題在於他們的上下文加載器依賴於任何Spring存儲庫中不再可用的類。 但是,它可以源自某些Spring MVC測試樣本

步驟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();
  }
}

我創建了一個示例應用程序 ,以演示該概念以及上下文在何處成功加載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM