写的Spring MVC应用程序,它内部依靠ContextLoader.getCurrentWebA

2019-09-17 00:43发布

我试着写集成测试对我们的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

Answer 1:

在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");


Answer 2:

你必须在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);
    }
}


Answer 3:

为什么ContextLoader.getCurrentWebApplicationContext是返回null的原因是,当你使用我的MockWebApplicationContextLoader,您使用的Web应用程序上下文,也没有特定的ContextLoader实现两者都不是。

由于你的资料库是由Spring管理的,你为什么不干脆注入配置对象到存储库? 注入配置对象是最合适的方式去访问它。 然后,您可以与注释@PostConstruct的方法初始化命名空间属性。

或者,您的DOA可以实现了ApplicationContextAware施工期间接收应用程序上下文的副本。



Answer 4:

存储您的属性文件中的类路径中。

现在访问该财产在你这样的控制器类:

/*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()
标签: spring-mvc