2

Spring Bean として公開されているアプリケーション サービスの 1 つの構成 xml ファイルを含む Web アプリケーションがあります。また、同じワークスペースにスタンドアロンの Java アプリケーション (pom.xml から Web アプリ プロジェクトを参照する) があり、Spring TestContext フレームワークを使用してテストを実行し、テストの 1 つがその XML ファイルの構成をチェックします。

ただし、スタンドアロン アプリからこの xml ファイルにアクセスする際に問題があります。

テストをセットアップする前に、以前の構成では、ファイルは ServletContext を介してアクセスされ、WEB-INF/フォルダーに配置されていました。ただし、テスト プロジェクトからアクセスできるようにするには、それをsource/フォルダーに移動し、ServletContext の代わりに getClassLoader().getResourceAsStream() メソッドでロードする必要がありました。ただし、毎回アプリを再デプロイする必要があるため、ファイルの編集が面倒です。

ファイルをWEB-INF/フォルダーに保持し、テスト実行中に参照プロジェクトからロードすることは可能ですか?

PS 現在、Tomcat サーバーを使用した STS プロジェクトです。

4

4 に答える 4

5

ファイルが存在する場所である場合は、必ず WEB-INF/ フォルダーの下にファイルを保管してください。

コマンド ラインから実行されているテスト クラス用。クラスパスのルートにあることがわかっているファイル (application.properties ファイルなど) に対して getClassLoader().getResource() を使用できます。そこから、プロジェクトの構造と、プロパティ ファイルに関連する WEB-INF/ の場所がわかります。URL を返すので、それを使用して、探している XML ファイルへのパスを見つけることができます。

URL url = this.getClass().getClassLoader().getResource("application.properties");
System.out.println(url.getPath());

File file = new File(url.getFile());
System.out.println(file);

// now use the Files' path to obtain references to your WEB-INF folder

うまくいけば、これが役に立つと思います。テストクラスがどのように実行されているかなどについて仮定する必要がありました.

File Classを見てください。getPath()、getAbsolutePath()、および getParent() メソッドが役に立つ可能性があります。

于 2012-05-17T16:32:27.523 に答える
3

私のサービスが実装されているので、テストが実行される前に、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(事実上インスタンス)を提供することです。@AutowiredServletContextAwareMockServletContext

おそらく、将来的には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 {

記事の詳細を参照してください

于 2012-05-18T08:53:35.867 に答える
1

これはクラスパス リソースなので、クラスパスに配置します: $webapp/WEB-INF/classes

Maven プロジェクトは、webapp をパッケージ化するときに $module/src/main/resources 内のものをこの場所にコピーします。(前者はソースパスであり、後者 - WEB-INF/classes - は、仕様ごとにサーブレットコンテナーによって常にクラスパスに配置されます。)

于 2012-05-18T23:37:20.553 に答える