java-在Spring集成测试期间刷新/重建特定的bean
作者:互联网
我们现有的Spring Boot集成设置使用@DirtiesContext在不同的测试方法之间重建整个bean池.
这是相当慢的,所以我们开始使用可以“刷新”或在内部拆除/重建的Bean,而无需重新创建实例.
问题是只有一些bean支持此功能.如果我们控制UsersBean,则可以实现UsersBean.refresh()方法并在我们的@After方法中调用它.
但是,如果我们有不支持刷新或无法控制的现有bean /类,我们如何有条件地指示在特定测试后需要对某些bean进行污染/重建?
或更简洁地说:在测试方法结束时,是否有一种方法可以将Bean池的一个子区域标记为肮脏,以进行重建?
解决方法:
看来这是可能的,至少在Spring Boot环境中如此. ApplicationContext实现有一个GenericApplicationContext,它具有removeBeanDefinition()的功能,然后可以通过registerBeanDefinition()重新注册.
甚至通过层叠来删除包含对要删除的bean的引用的bean(此实现可以在DefaultSingletonBeanRegistry.destroyBean()中看到).
例如,如果Bean1被Bean2引用:
@Component
public class Bean1 {
}
@Component
public class Bean2 {
@Autowired
public Bean1 bean1;
}
然后测试可以从上下文中删除bean1,并看到bean2也被替换了:
@RunWith(SpringRunner.class)
public class BeanRemovalTest implements ApplicationContextAware {
@Autowired
private Bean1 bean1;
@Autowired
private Bean2 bean2;
private ApplicationContext applicationContext;
@Test
public void test1() throws Exception {
System.out.println("test1():");
System.out.println(" bean1=" + bean1);
System.out.println(" bean2.bean1=" + bean2.bean1);
resetBean("bean1");
}
@Test
public void test2() throws Exception {
System.out.println("test2():");
System.out.println(" bean1=" + bean1);
System.out.println(" bean2.bean1=" + bean2.bean1);
}
private void resetBean(String beanName) {
GenericApplicationContext genericApplicationContext = (GenericApplicationContext) applicationContext;
BeanDefinition bd = genericApplicationContext
.getBeanDefinition(beanName);
genericApplicationContext.removeBeanDefinition("bean1");
genericApplicationContext.registerBeanDefinition("bean1", bd);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
}
这显示了两个被替换的bean实例:
test1():
bean1=hello.so.Bean1@61d6015a
bean2.bean1=hello.so.Bean1@61d6015a
test2():
bean1=hello.so.Bean1@2e570ded
bean2.bean1=hello.so.Bean1@2e570ded
(如果将resetBean(“ bean1”)注释掉,则两次都是同一实例).
一定会有一些无法解决的问题-例如如果另一个bean持有从ApplicationContext.getBean()获得的引用.
标签:spring-boot,junit,integration-testing,spring,java 来源: https://codeday.me/bug/20191108/2007926.html