9

我正在尝试为我们的 spring mvc 应用程序中的控制器编写集成测试。控制器调用一个服务类,该服务类又调用一个 dao 从存储库中读取/写入数据。DAO 需要查找一些配置。配置 bean 定义在 WEB-INF/applicationContext.xml 中。

我正在使用这样的东西:

配置 config =(Configuration)ContextLoader.getCurrentWebApplicationContext().getBean("config");
私有字符串命名空间 = config.getProperty("someproperty");

属性存储在 zookeeper 中,所以我没有使用 spring 的属性管理工件。

问题是在运行 JUnit 测试时 ContextLoader.getCurrentWebApplicationContext() 总是返回 null。

到目前为止,我已经看过以下方法:
1. Ted Young 的方法(只是谷歌搜索 spring mvc 集成测试 ted young)
2. https://github.com/SpringSource/spring-test-mvc
3. 这个站点.. questions/8464919/unit-testing-a-servlet-that-depends-on-springs-webapplicationcontextutils-getre
4. 使用 Selenium/JWebunit
5. http://confluence.highsource.org/display/Hifaces20/Hifaces20+Testing+package+ -+测试%2C+跟踪+和+调试+web+应用程序+with+Jetty

1 没有解决这个问题。WebApplicationContext 保持为空
2 表示对 WebApplicationContext 的支持将在 spring 3.2
3 中可用。我不明白这一点。我从哪里获得 testApplicationContext 和 getServletContext()?
4. 我不想走这条路,因为这完全是黑盒测试。
5. 我目前正在看 5. 但这需要启动一个 servlet 容器。没有其他选择吗?

我将不胜感激您能提供的任何帮助。

感谢 PixalSoft

@Ted Young SO 不允许我完成我所说的话。使用 loader=MockWebApplicationContextLoader,它不应该可以作为默认上下文加载器使用,就像 Spring ContextLoader 在 webapp 由 servletcontainer 初始化时的行为一样吗?有吗?我需要做一些特别的事情来处理 MockWebApplicationContextLoader?注入配置对象适用于单例对象。但不可能都是单例的。在每个构造函数中传递一个配置对象听起来太乏味了。现在,我创建了一个具有静态配置对象的类,通过 setter 方法自动装配。我会看看 ApplicationContextAware.Many thx

4

4 回答 4

5

您必须手动将 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);
    }
}
于 2015-09-18T04:43:37.070 回答
4

在 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");
于 2013-02-12T11:00:03.843 回答
1

ContextLoader.getCurrentWebApplicationContext 返回 null 的原因是,当您使用我的 MockWebApplicationContextLoader 时,您既没有使用 Web 应用程序上下文,也没有使用特定的 ContextLoader 实现。

既然你的存储库是由 Spring 管理的,为什么不简单地将配置对象注入到存储库中呢?注入配置对象是访问它的最合适的方式。然后,您可以在使用 @PostConstruct 注释的方法中初始化您的命名空间属性。

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

于 2012-05-05T00:15:27.653 回答
0

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

现在在你的控制器类中访问该属性,如下所示:

/*to access your filename.properties file */
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.properties"));

String  sServerLocation = properties.getProperty("key");

现在您可以访问您的属性文件。

我相信它会起作用。

于 2012-05-04T09:15:34.030 回答