我试着写集成测试对我们的Spring MVC应用的控制器。 控制器调用一个服务类继而调用DAO来从存储库中读/写数据。 该DAO需要查找一些配置。 配置Bean在WEB-INF / applicationContext.xml中定义。
我使用的是这样的:
配置的配置=(配置)ContextLoader.getCurrentWebApplicationContext()的getBean( “配置”);
私人字符串命名空间= config.getProperty( “someproperty”);
该属性存储在饲养员所以我不使用Spring的物业管理文物。
问题是,在运行JUnit测试ContextLoader.getCurrentWebApplicationContext()始终返回null。
我迄今看着下面的方法:
特德年轻的做法(只是谷歌搜索的Spring MVC集成测试特德年轻)
2. https://github.com/SpringSource/spring-test-mvc
3,本网站..问题/ 8464919 /单元测试-A-servlet的是,依赖上,弹簧-webapplicationcontextutils-getre
4.使用硒/ jWebUnit进行
5. http://confluence.highsource.org/display/Hifaces20/Hifaces20+Testing+package+-+testing%2C+tracing+and+debugging+web+applications+with+Jetty
1不能解决这个问题。 WebApplicationContext中保持空
对于支持的WebApplicationContext 2个状态将在弹簧3.2可用
3.我不明白这一点。 我在哪里,从得到testApplicationContext和getServletContext()方法?
4.我不希望走这条路,因为这完全是黑箱测试。
5.我目前看5但这需要启动一个servlet容器。 难道就没有别的选择吗?
我感谢所有帮助您可以提供。
由于PixalSoft
@Ted年轻,所以没让我完成我是saying.With装载机= MockWebApplicationContextLoader,是不是应该可以作为默认的ContextLoader完全一样时,web应用程序是由servletcontainer初始化的春天的ContextLoader的行为吗?有一些特别的东西,我需要做坐上MockWebApplicationContextLoader一个手柄?注入的配置对象适用于单一对象。 但这一切不能单。 在每一个构造函数传递配置对象听起来太繁琐。 现在,我已经创建了一类具有静态配置对象,通过一个setter方法自动装配。 我会看看ApplicationContextAware.Many THX
在JUnit测试的开头添加以下代码:
MockServletContext sc = new MockServletContext("");
sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM,
"/applicationContext-test.xml"); // <== Customize with your paths
ServletContextListener listener = new ContextLoaderListener();
ServletContextEvent event = new ServletContextEvent(sc);
listener.contextInitialized(event);
如果需要添加多个XML的上下文路径只是把它们与空格隔开,这样相同的字符串:
sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM,
"/applicationContext-test.xml /applicationContext-other.xml");
你必须在WebApplication的情况下手动添加到ContextLoderListner。 这将工作。
@ContextConfiguration(locations = "classpath:module-test-beans.xml")
@WebAppConfiguration
public class SampleTest extends AbstractTestNGSpringContextTests {
@Autowired
private WebApplicationContext wac;
@BeforeClass
public void setUp() throws ServletException {
MockServletContext sc = new MockServletContext("");
ServletContextListener listener = new ContextLoaderListener(wac);
ServletContextEvent event = new ServletContextEvent(sc);
listener.contextInitialized(event);
}
@Test
public void testMe() {
Assert.assertFalse(ContextLoader.getCurrentWebApplicationContext() == null);
}
}
为什么ContextLoader.getCurrentWebApplicationContext是返回null的原因是,当你使用我的MockWebApplicationContextLoader,您使用的Web应用程序上下文,也没有特定的ContextLoader实现两者都不是。
由于你的资料库是由Spring管理的,你为什么不干脆注入配置对象到存储库? 注入配置对象是最合适的方式去访问它。 然后,您可以与注释@PostConstruct的方法初始化命名空间属性。
或者,您的DOA可以实现了ApplicationContextAware施工期间接收应用程序上下文的副本。
存储您的属性文件中的类路径中。
现在访问该财产在你这样的控制器类:
/*to access your filename.properties file */
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.properties"));
String sServerLocation = properties.getProperty("key");
现在你可以访问你的属性文件。
我相信它会工作。
文章来源: Write Junit tests for Spring MVC application which internally relies upon ContextLoader.getCurrentWebApplicationContext()