在测试期间从上下文中删除单例bean

时间:2015-02-02 04:47:48

标签: spring spring-mvc spring-integration spring-test

我有一个使用spring-REST编写的应用程序(Spring版本4.1.x并使用spring测试来测试它。其中一个单例bean正在缓存状态,以便它可以用于应用程序中的后续调用。虽然我正在运行多个测试时导致问题,因为在测试中使用相同的bean并且后续测试失败。我的问题是如何重置拆解中的状态? 国家不能作为班级的私人成员进入。我们可以完全从上下文中删除bean吗?我正在使用带注释的bean并在需要的地方自动装配。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = ComponentTestConfig.class)
public class WebServiceComponentTest {

}

我尝试使用以下链接中给出的解决方案 How can i remove a singleton spring bean from ApplicationContext?

但总是faiuls没有找到bean定义 ((BeanDefinitionRegistry)beanFactory).removeBeanDefinition(“myBean”);

顺便说一下,只有当拆除要求重置bean状态时,测试才会失败。 Bean在应用程序使用时被找到。

2 个答案:

答案 0 :(得分:0)

如果您希望对测试应用程序上下文进行更细粒度的控制,请镜像XML配置文件以进行测试。将测试类指向仅从测试目录加载XML文件,而不是从WebContent目录加载。

通过这种方式,您可以完全排除导致测试环境出现问题的类。因此,您的测试XML可能如下所示:

<context:component-scan base-package = 
    "au.com.foo.pineapple", 
    "au.com.foo.dolphin",
    "au.com.foo.controllers"
/>
<!--au.com.foo.building-->

,您的WebContent XML文件可能如下所示:

<context:component-scan base-package =
    "au.com.foo.pineapple",
    "au.com.foo.dolphin",
    "au.com.foo.building",
    "au.com.foo.controllers"
/>

答案 1 :(得分:0)

正如M. Deinum指出的那样,最安全的方法是使用@DirtiesContext注释。

但是,如前所述,使用@DirtiesContext可能会导致测试运行时间更长,因为ApplicationContext将从ContextCache中删除。

另一个选项 - 实际上是 hack - 是使用ReflectionTestUtils中的spring-test类来更改相关私有成员的状态。

此致

Sam( Spring TestContext Framework的作者