为内部依赖ContextLoader的Spring MVC应用程序编写Junit测试,getCurrentWebApplicationContext()

gr8qqesn  于 2023-04-30  发布在  Spring
关注(0)|答案(4)|浏览(194)

我正在尝试为spring mvc应用程序中的一个控制器编写集成测试。控制器调用一个服务类,服务类又调用一个DAO从存储库读/写数据。DAO需要查找一些配置。配置bean在WEB-INF/applicationContext中定义。xml文件。
我用的是这样的东西:
Configuration config =(Configuration)ContextLoader。getCurrentWebApplicationContext()。getBean(“config”);
private String namespace = config。getProperty(“);
属性存储在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
  3. http://confluence.highsource.org/display/Hifaces20/Hifaces20+Testing+package+-+testing%2C+tracing+and+debugging+web+applications+with+Jetty
    % 1无法解决此问题。WebApplicationContext保持为空
    2表示对WebApplicationContext的支持将在Spring 3中提供。2
    3.我不明白从哪里获取testApplicationContext和getServletContext()?
    4.我不想走这条路,因为这完全是黑盒测试。
    5.我现在在看5。但这需要启动servlet容器。没有别的选择了吗?
    我将感激你能提供的任何帮助。
    感谢PixalSoft
    @Ted Young不允许我说完我说的话。使用loader=MockWebApplicationContextLoader,当webapp由servletcontainer初始化时,Spring ContextLoader的行为不应该与默认的contextloader一样吗?我需要做什么特殊的事情来获得MockWebApplicationContextLoader的句柄?注入config对象适用于单例对象。但不可能都是单例的。在每个构造函数中传递配置对象听起来太乏味了。现在,我已经创建了一个类,它有一个静态配置对象,通过setter方法自动连接。我将看看ApplicationContextAware。很多thx
o8x7eapl

o8x7eapl1#

您必须手动将WebApplicationContext添加到ContextLoaderListener。这会有用的

@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);
    }
}
wooyq4lh

wooyq4lh2#

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

flvtvl503#

为什么要使用ContextLoader。getCurrentWebApplicationContext返回null是因为,当您使用我的MockWebApplicationContextLoader时,您既没有使用Web应用程序上下文,也没有使用特定的ContextLoader实现。
既然你的仓库是由Spring管理的,为什么不简单地将config对象注入仓库呢?注入config对象是访问它的最合适的方法。然后,您可以在用@PostConstruct注解的方法中初始化名称空间属性。
或者,您的DOA可以实现ApplicationContextAware,以便在构造期间接收应用程序上下文的副本。

zqry0prt

zqry0prt4#

将属性文件存储在类路径中。
现在访问控制器类中的属性,如下所示:

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

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

现在你可以访问你的财产文件了。
我相信它会工作。

相关问题