javascript
Spring测试支持和上下文缓存
我打算在這里介紹一些有關(guān)緩存的注意事項(xiàng),這可能并不全面,但是基于我遇到的某些情況:
1.緩存基于Spring應(yīng)用程序上下文文件的位置
考慮一個(gè)示例Spring配置文件:
<?xml version='1.0' encoding='UTF-8' standalone='no'?> <beans xmlns='http://www.springframework.org/schema/beans'xmlns:context='http://www.springframework.org/schema/context'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:p='http://www.springframework.org/schema/p'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd'><bean id='user1' class='org.bk.lmt.domain.TaskUser' p:username='user1' p:fullname='testUser1' /><bean name='user2' class='org.bk.lmt.domain.TaskUser' p:username='user2' p:fullname='testUser' /><bean class='org.bk.contextcaching.DelayBean'/></beans>還有一個(gè)樣本測試,用于加載此上下文文件并進(jìn)行驗(yàn)證。
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { 'contexttest.xml' }) public class Test1 {@Autowired Map<String, TaskUser> usersMap;@Testpublic void testGetAUser() {TaskUser user = usersMap.get('user1');assertThat(user.getFullname(), is('testUser1'));} }我故意添加了一個(gè)bean(DelayBean),它花了大約2秒鐘來實(shí)例化,以模擬加載緩慢的Spring Application Context。
如果我現(xiàn)在運(yùn)行一個(gè)帶有兩個(gè)測試的小型測試套件,兩個(gè)測試都使用相同的應(yīng)用程序上下文,則行為是第一個(gè)測試需要大約2秒鐘才能運(yùn)行,但是第二個(gè)測試由于上下文緩存而很快就可以運(yùn)行。
如果使用不同的應(yīng)用程序上下文進(jìn)行了第三項(xiàng)測試,則該測試將再次花費(fèi)時(shí)間來運(yùn)行,因?yàn)楸仨毤虞d新的應(yīng)用程序上下文:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { 'contexttest2.xml' }) public class Test3 { ... }2.應(yīng)用程序上下文的緩存尊重運(yùn)行測試的活動(dòng)配置文件–本質(zhì)上,該配置文件也是Spring用于緩存上下文的內(nèi)部密鑰的一部分,因此,如果兩個(gè)測試使用的是完全相同的應(yīng)用程序上下文,但不同的配置文件是對于每個(gè)測試都處于活動(dòng)狀態(tài),則緩存的應(yīng)用程序上下文將不會(huì)用于第二個(gè)測試:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { 'contexttest.xml' }) @ActiveProfiles('dev1') public class Test1 { .... @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { 'contexttest.xml' }) @ActiveProfiles('dev2') public class Test2 { ....3.即使使用新的@Configuration樣式定義應(yīng)用程序上下文并在測試中使用它,應(yīng)用程序上下文的緩存也適用:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes={TestConfiguration.class}) public class Test1 { ... @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes={TestConfiguration.class}) public class Test2 { ....緩存的一個(gè)含義是,如果測試類修改了bean的狀態(tài),則測試套件中使用緩存的應(yīng)用程序上下文的另一個(gè)類將最終看到修改后的bean,而不是在應(yīng)用程序上下文中定義的bean。 :
例如。 考慮兩個(gè)測試,這兩個(gè)測試都在上下文中修改了一個(gè)bean,但是在狀態(tài)中聲明了它在應(yīng)用程序上下文中定義的方式–在這里,其中一個(gè)測試最終會(huì)失敗(基于Junit執(zhí)行測試的順序) ):
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes={TestConfiguration.class}) public class Test1 {@Autowired Map<String, TaskUser> usersMap;@Testpublic void testGetAUser1() {TaskUser user = usersMap.get('user1');assertThat(user.getFullname(), is('testUser1'));user.setFullname('New Name');}@Testpublic void testGetAUser2() {TaskUser user = usersMap.get('user1');assertThat(user.getFullname(), is('testUser1'));user.setFullname('New Name');} }解決方法是指示Spring測試支持人員該應(yīng)用程序上下文現(xiàn)在很臟并且需要為其他測試重新加載,這是通過@DirtiesContext批注完成的,可以在測試類級別或測試方法級別指定該批注。
@Test @DirtiesContext public void testGetAUser2() { ...祝您編程愉快,別忘了分享!
參考: all和其他博客中的JCG合作伙伴 Biju Kunjummen提供的Spring測試支持和上下文緩存 。
翻譯自: https://www.javacodegeeks.com/2012/09/spring-testing-support-and-context.html
總結(jié)
以上是生活随笔為你收集整理的Spring测试支持和上下文缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义报文格式(自定义报文ddos)
- 下一篇: PrimeFaces在GlassFish