问题描述
我最终使用SpringMockServletContext类,并在测试运行之前将其直接注入到我的服务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类并将其类名传递给 批注。
是重构服务并ServletContext
通过@Autowired
而不是进行注入ServletContextAware
,并提供相应类型的bean(实际上是一个MockServletContext
实例)。
将来可能MockServletContext
会在Spring中添加来自测试类的直接支持,请参阅SPR-5399和SPR-5243。
在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 {
查看文章中的详细信息
解决方法
我有一个Web应用程序,其中包含我的应用程序服务之一的配置xml文件,该文件显示为spring
bean。另外,我在同一个工作区中有一个独立的Java应用程序(从其pom.xml引用我的Web应用程序项目),该应用程序使用Spring
TestContext框架运行测试,并且其中一个测试检查该XML文件的配置。
但是我从独立应用程序访问此xml文件时遇到问题:
在设置测试之前,在我之前的配置中,该文件是通过ServletContext访问的,位于 WEB-INF /
文件夹中。但是,要使其能够从测试项目访问,我必须将其移至 源/
文件夹,并使用getClassLoader()。getResourceAsStream()方法而不是ServletContext进行加载。但这使编辑文件变得麻烦,因为每次必须重新部署应用程序时。
是否可以将文件保留在 WEB-INF / 文件夹中,但在测试运行期间从引用项目中加载它?
PS当前是带有Tomcat服务器的STS项目。