web-dev-qa-db-ja.com

SpringでJUnitテスト用にServletContextを注入する方法は?

ApacheCXFで記述されたRESTfulインターフェイスを単体テストしたいと思います。

ServletContextを使用していくつかのリソースをロードしているので、次のようになります。

@Context
private ServletContext servletContext;

これをGlassfishにデプロイすると、ServletContextが挿入され、期待どおりに機能します。しかし、サービスクラスにServletContextを挿入する方法がわからないため、JUnitテストでテストできます。

Spring 3.0、JUnit 4、CXF 2.2.3、Mavenを使用しています。

19
Juri Glass

単体テストでは、おそらく MockServletContext のインスタンスを作成する必要があります。

次に、setterメソッドを介してこのインスタンスをサービスオブジェクトに渡すことができます。

21
Chris J

Spring 4の時点で、ユニットテストクラスの@WebAppConfigurationアノテーションで十分です。 Springリファレンスドキュメント を参照してください。

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

おそらく、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;
        }
    });

}
1
Adrian Duta