1

単体テストと TDD 用のモック データを作成するために、POJO オブジェクトを外部エンティティ (XML、YAML、構造化テキスト、または書き込みと保守が簡単なもの) にバインドする方法が必要です。以下は私が試したいくつかのライブラリですが、それらの主な問題は、私が (少なくとも 3 か月以上) Java 1.4 に固執していることです。代わりに、可能な限り低いオーバーヘッドと事前設定 (たとえば、スキーマや DTD の使用など) を使用し、複雑な XML を使用せずに使用できるものについての洞察が欲しいです。私が本当に気に入っているライブラリは次のとおりです (ただし、1.4 では動作しないか、コンストラクタをサポートしていないようです。セッターが必要です)。

RE-JAXB (または、Really Easy Java XML バインディング)

http://jvalentino.blogspot.com/2008/07/in-response-to-easiest-java-xml-binding.html http://sourceforge.net/projects/rejaxb/

これをシームレスにバインドします。

<item>
    <title>Astronauts' Dirty Laundry</title>
    <link>http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp</link>
    <description>Compared to earlier spacecraft, the International Space
    Station has many luxuries, but laundry facilities are not one of them.
    Instead, astronauts have other options.</description>
    <pubDate>Tue, 20 May 2003 08:56:02 GMT</pubDate>
    <guid>http://liftoff.msfc.nasa.gov/2003/05/20.html#item570</guid>
</item>

これに:

@ClassXmlNodeName("item")
public class Item {
 private String title;
 private String link;
 private String description;
     private String pubDate;
     private String guid;

     //getters and settings go here... 
}

使用:

Rss rss = new Rss();
XmlBinderFactory.newInstance().bind(rss, new File("Rss2Test.xml"));

問題: アノテーションに依存しているため、Java 1.4 には適していません。

jYaml http://jyaml.sourceforge.net/

これをシームレスにバインドします。

--- !user
name: Felipe Coury
password: felipe
modules: 
   - !module
     id: 1
     name: Main Menu
     admin: !user
    name: Admin
    password: password

これに:

public class User {
    private String name;
    private String password;
    private List modules;
}

public class Module {
    private int id;
    private String name;
    private User admin;
}

使用:

YamlReader reader = new YamlReader(new FileReader("example.yaml"));
reader.getConfig().setClassTag("user", User.class);
reader.getConfig().setClassTag("module", Module.class);
User user = (User) reader.read(User.class);

問題: コンストラクターでは機能しません (不変オブジェクトには適していません)。オブジェクトを変更するか、YAML 解析を処理するカスタム コードを作成する必要があります。

データ記述子を書くことはできる限り避けたいということを覚えておいてください。

何か提案はありますか?

4

3 に答える 3

2

投入するオブジェクトが単純な Bean の場合は、apache common の BeanUtils クラスを確認することをお勧めします。populate() メソッドは、説明されているケースに適している場合があります。一般に、Spring のような依存性注入フレームワークは非常に便利ですが、それは現在の問題に対する答えではない可能性があります。xml 形式の入力の場合、jibx が適切な代替手段になる可能性があるため、jaxb 1.0 が適しています。

于 2008-10-12T16:44:38.453 に答える
0

Java1.4のプラットフォームに追加されたデフォルトのXMLEncoder/XMLDecoderを試してみてください。

これが私がそれを使う方法です。

import java.beans.XMLEncoder;
import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ToXml {

    /**
     * Write an object to a file in XML format.
     * @param o - The object to serialize.
     * @param file - The file where to write the object.
     */
    public static void writeObject( Object o, String file  ) {
       XMLEncoder e = null;
       try {

           e = new XMLEncoder( new BufferedOutputStream( new FileOutputStream(file)));

           e.writeObject(o);

       }catch( IOException ioe ) {
           throw new RuntimeException( ioe );
       }finally{
           if( e != null ) {
               e.close();
           }
       }
    }

    /**
     * Read a xml serialized object from the specified file.
     * @param file - The file where the serialized xml version of the object is.
     * @return  The object represented by the xmlfile.
     */
    public static Object readObject( String file ){
       XMLDecoder d = null;
       try {

           d = new XMLDecoder( new BufferedInputStream( new FileInputStream(file)));

           return  d.readObject();

       }catch( IOException ioe ) {
           throw new RuntimeException( ioe );
       }finally{
           if( d != null ) {
               d.close();
           }
       }
    }

}

それは簡単で、シンプルで、コアライブラリにあります。

ロードメカニズムを作成するだけです。

リモートEJBから5〜10秒でデータをロードするこのswingアプリがあります。私がやっていることは、前のセッションをこのようにXMLで保存することです。アプリが読み込まれると、前のセッションのすべてのデータが1秒以内に保存されます。

ユーザーがアプリの操作を開始している間、バックグラウンドスレッドは、前回のセッション以降に変更された要素をフェッチします。

于 2008-10-12T23:01:11.423 に答える
0

XStream を使用するだけです (XML の場合、または JSON を試すことができます)。

しかし...

男、テストデータを単体テスト自体の外に置くと、読めないテストにつながると考えざるを得ません。テスト ケースを読み取るときに 2 つのファイルを参照する必要があり、リファクタリング ツールが失われます (プロパティの名前を変更するとき)。Jay Fields は、私よりもうまく説明できます。

http://blog.jayfields.com/2007/06/testing-inline-setup.html

敬具

于 2008-10-12T17:57:28.637 に答える