JUnit 测试在一起运行时失败,但单独通过
我有一堆JUnit测试,它们都是单独运行的。每个都是真正的独立单元测试 - 测试中的单个类。不需要上下文。我可以在Eclipse中或通过maven / surefire-plugin单独或一起运行它们。
此后,我添加了一个新的集成测试,该测试利用了Spring Context等,并使用SpringJUnit4ClassRunner。一旦我将此测试添加到我的套件中,任何测试用例都会在此类失败后运行。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = IntegrationTestConfiguration.class)
@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)
@ActiveProfiles("test")
public class ImportServiceIntegrationTest {
...
}
我不确定这是否具有巨大的价值,但我也在这里发布我的配置类:
@EnableAutoConfiguration(exclude = { WebMvcAutoConfiguration.class,
DispatcherServletAutoConfiguration.class,
EmbeddedServletContainerAutoConfiguration.class,
WebSocketAutoConfiguration.class })
@ComponentScan(basePackages = "com.rtc.synchronize",
excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern="com\\.rtc\\.synchronize\\.config\\.AppConfig"))
@EnableJpaRepositories("com.util.veracode.rtc.synchronize")
@EntityScan("com.util.veracode.rtc.synchronize")
public class IntegrationTestConfiguration {
}
如果我的实际类有用,我也可以发布它们,尽管为了简洁起见,我已经避免了它们(我不完全确定它们有多大用处)。@Configuration
我怀疑在测试类终止后,JVM中维护了一些东西(一些静态数据)。
我正在使用以下配置的Spring Cache注释:
@Configuration
@EnableCaching(mode=AdviceMode.ASPECTJ)
public class CacheConfig extends CachingConfigurerSupport{
/**
* EhCache configuration. Used to minimize calls to Veracode
*
* @return
*/
@Bean(destroyMethod="shutdown")
public net.sf.ehcache.CacheManager ehCacheManager() {
...
...
}
...
}
一旦我的集成测试类完成,我的后续测试就会引发以下错误:
java.lang.IllegalStateException: The workItems Cache is not alive (STATUS_SHUTDOWN)
at net.sf.ehcache.Cache$CacheStatus.checkAlive(Cache.java:4097)
at net.sf.ehcache.Cache.checkStatus(Cache.java:2788)
at net.sf.ehcache.Cache.get(Cache.java:1744)
at org.springframework.cache.ehcache.EhCacheCache.get(EhCacheCache.java:65)
at org.springframework.cache.interceptor.AbstractCacheInvoker.doGet(AbstractCacheInvoker.java:68)
at org.springframework.cache.interceptor.CacheAspectSupport.findInCaches(CacheAspectSupport.java:461)
at org.springframework.cache.interceptor.CacheAspectSupport.findCachedItem(CacheAspectSupport.java:432)
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:333)
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:299)
at org.springframework.cache.aspectj.AbstractCacheAspect.ajc$around$org_springframework_cache_aspectj_AbstractCacheAspect$1$2bc714b5(AbstractCacheAspect.aj:74)
at com.synchronize.repository.rtc.WorkItemRepositoryImpl.findById(WorkItemRepositoryImpl.java:192)
at com.synchronize.repository.rtc.WorkItemRepositoryImpl.findById(WorkItemRepositoryImpl.java:192)
at com.synchronize.repository.rtc.WorkItemRepositoryImpl.getState(WorkItemRepositoryImpl.java:179)
at com.synchronize.repository.rtc.WorkItemRepositoryImplTest.testGetState(WorkItemRepositoryImplTest.java:178)
因此,我很清楚Spring在完成后不会清理某些内容(我的后续课程甚至没有加载Spring上下文 - 这是一个普通的香草Junit测试!
如果我添加到我的surefire插件定义中,所有测试都通过,但我对该解决方案/解决方法不满意。它减慢了构建速度,并且在Eclipse中不受尊重 - 也就是说,我只是在一次射击中对整个项目运行JUnit测试运行程序而不会失败。<resueForks>false</reuseForks>
我是否必须做一些特别的事情来确保Spring在测试用例完成后将自己从JVM中清除出来?为什么我在集成测试后有一些Spring配置?