7

私はmavenと標準のディレクトリレイアウトを使用しています。そこで、src / test / resourcesフォルダーにtestdata.xmlファイルを追加し、次のように追加しました。

.addAsWebInfResource("testdata.xml", "testdata.xml")

展開方法で、そこにあることを確認しました。これにより、ファイルがに表示され/WEB-INF/testdata.xmlます。ここで、コードにこのファイルへの参照を含める必要があります。いくつかの異なる方法を試し、何度getClass().getResourceAsStream(...)も失敗したので、今すぐアドバイスが必要です。

DBUnit統合テストに必要です。これは不可能ですか?

4

4 に答える 4

19

オプションA)ServletContext.getResourceXXX()を使用します

AquillarianMockHttpSessionとMockServletContextが必要です。例えば:

@Test
   public void myTest()
   {
      HttpSession session = new MockHttpSession(new MockServletContext());
      ServletLifecycle.beginSession(session);

      ..testCode..

      // You can obtain a ServletContext (will actually be a MockServletContext 
      // implementation):
      ServletContext sc = session.getServletContext();
      URL url = sc.getResource("/WEB-INF/testdata.xml")
      Path resPath = new Path(url);
      File resFile = new File(url);
      FileReader resRdr = new FileReader(resFile);
      etc...

      ..testCode..

      ServletLifecycle.endSession(session);
   }

次の場所でリソースファイルとサブディレクトリを作成できます。

  1. Webモジュールのドキュメントルート-リソースはブラウザとクラスからアクセスできます
  2. WEB-INF /classes/-リソースはクラスにアクセス可能です
  3. WEB-INF / lib/*。jarsourcejar-クラスにアクセス可能
  4. WEB-INF / lib/*。jar専用のリソース専用jar-クラスにアクセス可能
  5. ディレクトリ内で直接WEB-INF/-クラスにアクセス可能。これがあなたが求めているものです。

すべての場合において、リソースには以下を介してアクセスできます。

URL url = sc.getResource("/<path from web doc root>/<resourceFileName>");
OR    
InputStream resIS = sc.getResourceAsStream("/<path from web doc root>/<resourceFileName>");

>>

これらはWARファイルにパッケージ化され、デプロイされたアプリサーバー上のディレクトリに展開されるか、アプリサーバー上のWARファイル内にとどまる可能性があります。どちらの方法でも-リソースにアクセスする場合と同じ動作:ServletContext.getResourceXXX()を使用します。

一般原則として、(5)最上位のWEB-INFディレクトリ自体はサーバーによる使用を目的としていることに注意してください。Webリソースをここに直接配置したり、独自のディレクトリをここに直接作成したりしないのは「礼儀正しい」ことです。代わりに、上記の(2)を使用することをお勧めします。

JEE5チュートリアルWebモジュール JEE6チュートリアルWebモジュール

オプションB):Class.getResourceXXX()を使用します

まず、リソースをWEB-INFフォルダーからWEB-INF / classesに(またはjar WEB-INF / lib / *。jar内に)移動します。

テストクラスが次の場合:

  • ファイルWEB-INF/classes / com / abc / pkg / test/MyTest.class内のcom.abc.pkg.test.MyTest

そして、あなたのリソースファイルは

  • WEB-INF / classes / com / abc / pkg / test / resources / testdata.xml(またはjarファイル内の同等のもの)

Java ClassLoaderを介して、相対ファイル位置を使用してファイルにアクセスします-クラスパスに関連するフォルダー/ジャーを検索します。

java.net.URL resFileURL = MyTest.class.getResource("resources/testdata.xml");
File resFile = new File(fileURL);    
OR
InputStream resFileIS = 
     MyTedy.class.getResourceAsStream("resources/testdata.xml");

完全なパッケージのような資格を使用して、Java ClassLoaderを使用してファイルにアクセスします-クラスパスに関連するフォルダ/Jarを検索します:

java.net.URL resFileURL = MyTest.class.getResource("/com/abc/pkg/test/resources/testdata.xml");
File resFile = new File(fileURL);        
OR 
InputStream resFileIS = 
     MyTest.class.getResourceAsStream("/com/abc/pkg/test/resources/testdata.xml");   
OR 
java.net.URL resFileURL = MyTest.class.getClassLoader().getResource("com/abc/pkg/test/resources/testdata.xml");
File resFile = new File(fileURL);       
OR 
InputStream resFileIS = 
     MyTest.class.getClassLoader().getResourceAsStream("com/abc/pkg/test/resources/testdata.xml");

それがそれを釘付けにすることを願っています!@B)

于 2012-11-05T05:34:17.857 に答える
5

下のファイルにアクセスする方法は、次WEB-INFの3つの方法ですServletContext

  1. getResource("/WEB-INF/testdata.xml")あなたにURLを与える
  2. getResourceAsStream入力ストリームを提供します
  3. getRealPath関連するファイルのディスク上のパスを示します。

最初の2つは常に機能するはずですが、リソースパスとディスク上のファイルが直接対応していない場合、たとえばWebアプリケーションが解凍されたディレクトリ構造ではなくWARファイルから直接実行されている場合、3つ目は失敗する可能性があります。

于 2012-11-02T21:05:48.027 に答える
2

今日、私は同じ要件に苦労していて、完全なソースサンプルが見つからなかったので、ここでは、まとめることができる最小の自己完結型テストを使用します。

@RunWith(Arquillian.class)
public class AttachResourceTest {

    @Deployment
    public static WebArchive createDeployment() {
        WebArchive archive =  ShrinkWrap.create(WebArchive.class).addPackages(true, "org.apache.commons.io")
                .addAsWebInfResource("hello-kitty.png", "classes/hello-kitty.png");             
        System.out.println(archive.toString(true));
        return archive;
    }

    @Test
    public void attachCatTest() {
        InputStream stream = getClass().getResourceAsStream("/hello-kitty.png");
        byte[] bytes = null;
        try {
            bytes = IOUtils.toByteArray(stream);
        } catch (IOException e) {
            e.printStackTrace();
        }   
        Assert.assertNotNull(bytes);
    }
}

プロジェクトでは、hello-kitty.pngファイルはsrc / test/resourcesに移動します。テストアーカイブでは、クラスパス上にある/ WEB-INF / classesフォルダーにパックされているため、テストシナリオで使用したコンテナーと同じクラスローダーを使用してロードできます。

IOUtilsはapachecommons-ioからのものです。

追記:頭を悩ませたのは、サーバーへのパスのスペースと、getResourceAsStream()がそのような特殊文字をエスケープする方法に関連していました:JavaのsysLoader.getResource()の問題

于 2014-09-10T16:12:34.190 に答える
1

このクラスをプロジェクトに追加します。

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

public class Init {
    private static final String WEB_INF_DIR_NAME="WEB-INF";
    private static String web_inf_path;
    public static String getWebInfPath() throws UnsupportedEncodingException {
        if (web_inf_path == null) {
            web_inf_path = URLDecoder.decode(Init.class.getProtectionDomain().getCodeSource().getLocation().getPath(), "UTF8");
            web_inf_path=web_inf_path.substring(0,web_inf_path.lastIndexOf(WEB_INF_DIR_NAME)+WEB_INF_DIR_NAME.length());
        }
        return web_inf_path;
    }
}

ここで、ファイルのフルパスを取得する場合は、次の"testdata.xml"コードまたは同様のコードを使用します。

String testdata_file_location = Init.getWebInfPath() + "/testdata.xml";
于 2012-11-06T06:57:33.670 に答える