更新
:这已在Spring Framework 3.2.9、4.0.4和4.1中修复。看见
SPR-11626
详细信息。
我的朋友。。。您在
Spring TestContext框架
.
这种行为的原因是
ServletTestExecutionListener
在每个测试方法之后重置请求属性,但是
DependencyInjectionTestExecutionListener
不会在每个测试方法之前重新注入依赖项(默认情况下)。当执行第二测试方法时
servletRequest
字段仍在引用
MockHttpServletRequest
为之前的测试方法创建的;鉴于
ServletTestExecutionListener
创建的新实例
模拟HttpServlet请求
并将其设置在请求属性中。因此,注入的请求和存储在
RequestContextHolder
仅对于在TestNG中执行的第一个测试方法相同。
既然我是这段代码的作者,我必须亲自道歉,但是。。。我会确保尽快修复。看见
第1166页
有关修复状态的详细信息。;)
笔记
:此错误仅适用于TestNG测试;这是真的
不
适用于JUnit测试。
作为解决方案,您可以使用
@DirtiesContext
(或使用
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
). 这将使您的测试按预期通过。
使用
@污垢上下文
将使Spring结束测试
ApplicationContext
在每个测试方法之后,这可能会对测试速度产生负面影响;然而,从Spring 3.2.8和4.0.3开始,这是唯一的非定制解决方案。
话虽如此,以下是一个更有效的解决方案。只需定义此自定义
TestExecutionListener
在项目中:
public class AlwaysReinjectDependenciesTestExecutionListener extends AbstractTestExecutionListener {
public void afterTestMethod(TestContext testContext) throws Exception {
testContext.setAttribute(DependencyInjectionTestExecutionListener.REINJECT_DEPENDENCIES_ATTRIBUTE, Boolean.TRUE);
}
}
然后像这样注释测试类:
@TestExecutionListeners(AlwaysReinjectDependenciesTestExecutionListener.class)
这应该可以解决任何问题
和
保持测试套件快速运行。
当做
山姆