我打算在這里介紹一些有關緩存的注意事項,這可能并不全面,但是基于我遇到的某些情況:
1.緩存基于Spring應用程序上下文文件的位置
考慮一個示例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>
還有一個樣本測試,用于加載此上下文文件并進行驗證。
@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'));}
}
我故意添加了一個bean(DelayBean),它花了大約2秒鐘來實例化,以模擬加載緩慢的Spring Application Context。
如果我現在運行一個帶有兩個測試的小型測試套件,兩個測試都使用相同的應用程序上下文,則行為是第一個測試需要大約2秒鐘才能運行,但是第二個測試由于上下文緩存而很快就可以運行。

如果使用不同的應用程序上下文進行了第三項測試,則該測試將再次花費時間來運行,因為必須加載新的應用程序上下文:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { 'contexttest2.xml' })
public class Test3 {
...
}

2.應用程序上下文的緩存尊重運行測試的活動配置文件–本質上,該配置文件也是Spring用于緩存上下文的內部密鑰的一部分,因此,如果兩個測試使用的是完全相同的應用程序上下文,但不同的配置文件是對于每個測試都處于活動狀態,則緩存的應用程序上下文將不會用于第二個測試:
@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樣式定義應用程序上下文并在測試中使用它,應用程序上下文的緩存也適用:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestConfiguration.class})
public class Test1 {
...
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestConfiguration.class})
public class Test2 {
....
緩存的一個含義是,如果測試類修改了bean的狀態,則測試套件中使用緩存的應用程序上下文的另一個類將最終看到修改后的bean,而不是在應用程序上下文中定義的bean。 :
例如。 考慮兩個測試,這兩個測試都在上下文中修改了一個bean,但是在狀態中聲明了它在應用程序上下文中定義的方式–在這里,其中一個測試最終會失敗(基于Junit執行測試的順序) ):
@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測試支持人員該應用程序上下文現在很臟并且需要為其他測試重新加載,這是通過@DirtiesContext批注完成的,可以在測試類級別或測試方法級別指定該批注。
@Test
@DirtiesContext
public void testGetAUser2() {
...
祝您編程愉快,別忘了分享!
參考: all和其他博客中的JCG合作伙伴 Biju Kunjummen提供的Spring測試支持和上下文緩存 。
翻譯自: https://www.javacodegeeks.com/2012/09/spring-testing-support-and-context.html