我有一个使用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在应用程序使用时被找到。
答案 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的作者)