海宁网站网站建设,高端设计网站源码,宁夏网站建设公司,阳逻开发区网站建设中企动力Spring为单元测试和集成测试提供了全面的支持-通过注释来加载Spring应用程序上下文#xff0c;并与JUnit和TestNG等单元测试框架集成。 由于为每个测试加载大型应用程序上下文需要时间#xff0c;因此Spring智能地为测试套件缓存应用程序上下文–通常#xff0c;当我们通过a… Spring为单元测试和集成测试提供了全面的支持-通过注释来加载Spring应用程序上下文并与JUnit和TestNG等单元测试框架集成。 由于为每个测试加载大型应用程序上下文需要时间因此Spring智能地为测试套件缓存应用程序上下文–通常当我们通过ant或maven对项目执行测试时会创建一个包含项目中所有测试的套件。 我打算在这里介绍一些有关缓存的注意事项这可能并不全面但是基于我遇到的某些情况 1.缓存基于Spring应用程序上下文文件的位置 考虑一个示例Spring配置文件 ?xml version1.0 encodingUTF-8 standaloneno?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:contexthttp://www.springframework.org/schema/contextxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:phttp://www.springframework.org/schema/pxsi:schemaLocationhttp://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.xsdbean iduser1 classorg.bk.lmt.domain.TaskUser p:usernameuser1 p:fullnametestUser1 /bean nameuser2 classorg.bk.lmt.domain.TaskUser p:usernameuser2 p:fullnametestUser /bean classorg.bk.contextcaching.DelayBean//beans 还有一个样本测试用于加载此上下文文件并进行验证。 RunWith(SpringJUnit4ClassRunner.class)
ContextConfiguration(locations { contexttest.xml })
public class Test1 {Autowired MapString, TaskUser usersMap;Testpublic void testGetAUser() {TaskUser user usersMap.get(user1);assertThat(user.getFullname(), is(testUser1));}
} 我故意添加了一个beanDelayBean它花了大约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 MapString, 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