在测试运行之前,我最终使用了 Spring MockServletContext类并将其直接注入到我的服务 bean 中,因为我的服务已实现ServletContextAware
:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/test-ctx.xml" } )
public class SomeServiceTest {
@Autowired
private MyServletContextAwareService myService;
@Before
public void before(){
//notice that I had to use relative path because the file is not available in the test project
MockServletContext mockServletContext = new MockServletContext("file:../<my web project name>/src/main/webapp");
myService.setServletContext(mockServletContext);
}
如果我有几个使用 Servlet Context 的类,那么更好的解决方案是使用WebApplicationContext而不是默认的(当前由 DelegatingSmartContextLoader 提供),但它需要实现自定义ContextLoader类并将其类名传递给@ContextConfiguration注释。
后来我想到的另一种更清洁的解决方案ServletContext
是重构服务并注入 via@Autowired
而不是弄乱ServletContextAware
,并提供相应类型的 bean(实际上是一个MockServletContext
实例)。
MockServletContext
将来可能会在 Spring 中添加对来自测试类的直接支持,请参阅SPR-5399和SPR-5243。
SPRING 3.2 的更新
在 Spring 3.2 中,servlet 上下文的初始化变得像添加一个@WebAppConfiguration
注释一样简单:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("file:../<my web project name>/src/main/webapp")
@ContextConfiguration(locations = { "/test-ctx.xml" } )
public class SomeServiceTest {
详见文章