【问题标题】:How to inject ServletContext for JUnit tests with Spring?如何使用 Spring 为 JUnit 测试注入 ServletContext?
【发布时间】:2011-02-10 02:36:03
【问题描述】:

我想对使用 Apache CXF 编写的 RESTful 接口进行单元测试。

我使用 ServletContext 来加载一些资源,所以我有:

@Context
private ServletContext servletContext;

如果我将它部署在 Glassfish 上,则会注入 ServletContext 并按预期工作。但我不知道如何在我的服务类中注入 ServletContext,以便我可以使用 JUnit 测试对其进行测试。

我使用 Spring 3.0、JUnit 4、CXF 2.2.3 和 Maven。

【问题讨论】:

标签: java spring junit cxf


【解决方案1】:

在您的单元测试中,您可能想要创建一个MockServletContext 的实例。

然后您可以通过 setter 方法将此实例传递给您的服务对象。

【讨论】:

    【解决方案2】:

    从 Spring 4 开始,单元测试类上的 @WebAppConfiguration 注解应该足够了,参见Spring reference documentation

    @ContextConfiguration
    @WebAppConfiguration
    public class WebAppTest {
        @Test
        public void testMe() {}
    }
    

    【讨论】:

    • 这对我来说没有效果。
    【解决方案3】:

    可能你想用 servletContext.getResourceAsStream 或类似的东西来读取资源,为此我使用了这样的 Mockito:

     @BeforeClass
    void setupContext() {
    
        ctx = mock(ServletContext.class);
        when(ctx.getResourceAsStream(anyString())).thenAnswer(new Answer<InputStream>() {
            String path = MyTestClass.class.getProtectionDomain().getCodeSource().getLocation().getPath()
                    + "../../src/main/webapp";
    
            @Override
            public InputStream answer(InvocationOnMock invocation) throws Throwable {
                Object[] args = invocation.getArguments();
                String relativePath = (String) args[0];
                InputStream is = new FileInputStream(path + relativePath);
                return is;
            }
        });
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2013-07-27
      • 1970-01-01
      • 2012-10-24
      • 2018-05-15
      相关资源
      最近更新 更多