ApacheCXFで記述されたRESTfulインターフェイスを単体テストしたいと思います。
ServletContextを使用していくつかのリソースをロードしているので、次のようになります。
@Context
private ServletContext servletContext;
これをGlassfishにデプロイすると、ServletContextが挿入され、期待どおりに機能します。しかし、サービスクラスにServletContextを挿入する方法がわからないため、JUnitテストでテストできます。
Spring 3.0、JUnit 4、CXF 2.2.3、Mavenを使用しています。
単体テストでは、おそらく MockServletContext のインスタンスを作成する必要があります。
次に、setterメソッドを介してこのインスタンスをサービスオブジェクトに渡すことができます。
Spring 4の時点で、ユニットテストクラスの@WebAppConfigurationアノテーションで十分です。 Springリファレンスドキュメント を参照してください。
@ContextConfiguration
@WebAppConfiguration
public class WebAppTest {
@Test
public void testMe() {}
}
おそらく、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;
}
});
}