[英]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
手動從包裝applicationContext
在AbstractJUnit4SpringContextTests
超類,並將其提供給所述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.