私のサービスが実装されているので、テストが実行される前に、Spring MockServletContextServletContextAware
クラスを使用して、それをサービスBeanに直接注入することになりました。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/test-ctx.xml" } )
public class SomeServiceTest {
@Autowired
private MyServletContextAwareService myService;
@Before
public void before(){
//notice that I had to use relative path because the file is not available in the test project
MockServletContext mockServletContext = new MockServletContext("file:../<my web project name>/src/main/webapp");
myService.setServletContext(mockServletContext);
}
サーブレットコンテキストを使用するクラスが複数ある場合は、デフォルトのクラス(現在DelegatingSmartContextLoaderによって提供されている)の代わりにWebApplicationContextを使用するのがより良い解決策ですが、カスタムContextLoaderクラスを実装し、そのクラス名を@ContextConfigurationアノテーションに渡す必要があります。
後で私の頭に浮かんだ代替のややクリーンな解決策は、サービスをリファクタリングし、をいじる代わりにServletContext
経由で注入し、対応するタイプのBean(事実上インスタンス)を提供することです。@Autowired
ServletContextAware
MockServletContext
おそらく、将来的にはMockServletContext
、テストクラスからの直接サポートがSpringに追加される予定です。SPR-5399およびSPR-5243を参照してください。
SPRING3.2の更新Spring3.2@WebAppConfiguration
では、サーブレットコンテキストの初期化は1つのアノテーション
を追加するのと同じくらい簡単になりました。
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("file:../<my web project name>/src/main/webapp")
@ContextConfiguration(locations = { "/test-ctx.xml" } )
public class SomeServiceTest {
記事の詳細を参照してください