9

マルチモジュールのmavenプロジェクトがあります。persist モジュール内には、DTD を参照する多数の XML ファイル データ ファイルがあります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE myapp-data SYSTEM "myapp-data.dtd" >

<dataset>
      .....omitted for brevity....
</dataset>

DTD は XML ファイルと同じディレクトリに保存され、Eclipse でもこれらの XML ファイルが有効であると報告されます。

しかし、アプリケーションを実行すると、DBUnit FlatXMLDataSet は DTD を見つけることができないため、FileNotFound 例外をスローします。どうやらルート プロジェクト ディレクトリ (myproject/ など) で DTD を探しているようです。XML ファイル自体と同じディレクトリ (myproject/persist/target/test-data など) で DTD を検索することを期待していました。

DBUnit のソース コードを見ると、「相対 DOCTYPE uri は現在の作業ディレクトリから解決されます」と書かれています。

これを修正する良い方法は何ですか?

4

5 に答える 5

9

OK、私はこれを理解したと思います。オープンソースに感謝します。

FlatXmlDataSetBuilderには、DTDにストリームを取得するメソッドがあります。これがパブリックメソッドIMOであるのはおかしなことですが、DBUnitがdtdファイルのXMLと同じディレクトリを検索しないのはおかしなことです。だからここにあります:

String dtdResourceName = "classpath:test-data/myapp-data.dtd";      
Resource res = applicationContext.getResource(dtdResourceName);
builder.setMetaDataSetFromDtd(res.getInputStream());

ここで、XMLと同じディレクトリにdtdを含むDOCTYPE宣言を残し、このハックを使用してDBUnitをだまして正しいことを実行させます。

于 2010-06-13T02:46:12.320 に答える
3

マルチモジュール ビルドにはローカル ビルドとは異なる作業ディレクトリがあるため、常に正しい変数を使用して特別なディレクトリにアクセスしてください。

そう

  • mydir使用する代わりに${project.basedir}/mydir
  • target/mydir使用する代わりに${project.build.directory}/mydir
  • target/classes/mydir使用する代わりに${project.build.outputDirectory}/mydir

これらの変数は、どこから呼び出されても、常に現在のプロジェクトに評価されます。これはPOM変数の概要です(完全ではありませんが、最も重要なものはそこにあります)

また、インタラクティブなクエリ スタイルのデバッグを行いたい場合は、help:evaluate mojoが便利です。

ただ電話する

mvn help:evaluate

式を求めるプロンプトが表示されます。などの式を入力する${project.build.plugins[0]}と、指定された要素のマージされた dom が一覧表示されます


編集:

わかりました、今私は問題を見ていると思います。次に、xmlでディレクトリを参照するだけではどうですか:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE myapp-data SYSTEM "target/test-classes/myapp-data.dtd" >

きれいではないことはわかっていますが、マルチモジュールであろうとなかろうと、うまくいくはずです。単体テストの現在のディレクトリは、親プロジェクトのディレクトリではなく、常に現在の ${project.basedir} です。

于 2010-06-11T07:34:49.620 に答える
0

XML ファイルを開くときは、「FileInputStream」ではなく「File」を使用してみてください。

例えば:

ReplacementDataSet dataSet = new ReplacementDataSet(new FlatXmlDataSet(new File(fileName)));

このように、DTD への相対パスは XML ファイルのディレクトリで始まる必要があります。

そして、あなたが使用する場合

ReplacementDataSet dataSet = new ReplacementDataSet(new FlatXmlDataSet(new FileInputStream(fileName)));

パスは、現在の作業ディレクトリからの相対パスである必要があります。

于 2012-02-15T19:24:03.610 に答える