Was libs kann ich POJOs auf externe Dateien für TDD ohne viel Aufwand zu binden?

StackOverflow https://stackoverflow.com/questions/195639

  •  10-07-2019
  •  | 
  •  

Frage

ich brauche einen Weg POJO zu binden Objekte an eine externen Einheit, das könnte XML sein, YAML, strukturierten Text oder etwas einfach zu schreiben und zu pflegen, um Mock Daten für Komponententests und TDD zu erstellen. Im Folgenden sind einige Bibliotheken, die ich versuchte, aber mit ihnen die Hauptprobleme waren, dass ich stecken bin (für mindestens weitere 3 Monate) auf Java 1.4. Ich mag keine Erkenntnisse darüber, was ich stattdessen mit so geringer Overhead und Upfront-Umgebung nutzen konnte (wie Schemen oder DTDs, zum Beispiel unter Verwendung) wie möglich und ohne komplexe XML. Hier sind die Bibliotheken, die ich mag (aber das scheinbar nicht mit 1.4 funktioniert oder nicht Konstrukteuren unterstützen - du musst haben Setter):

RE-JAXB (oder Really Easy Java XML-Bindungen)

< a href = "http://jvalentino.blogspot.com/2008/07/in-response-to-easiest-java-xml-binding.html" rel = "nofollow noreferrer"> http://jvalentino.blogspot.com /2008/07/in-response-to-easiest-java-xml-binding.html http://sourceforge.net/projects/rejaxb/

Seamlessy bindet diese:

<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>

Um dies zu:

@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... 
}

Mit:

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

Problem: Es stützt sich auf Anmerkungen, so nicht gut für Java 1.4

JYAML http://jyaml.sourceforge.net/

Nahtlos bindet diese:

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

Um dies zu:

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

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

Mit:

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);

Problem: Es wird nicht mit Konstrukteure arbeiten (so nicht gut für unveränderliche Objekte). Ich würde haben, entweder meine Objekte zu ändern oder benutzerdefinierten Code por schreiben die YAML Parsing Handhabung.

Beachten Sie, dass ich vermeiden möchte - so viel wie ich kann -. Datenbezeichner schreiben, würde ich etwas, das „einfach funktioniert“

Haben Sie irgendwelche Vorschläge?

War es hilfreich?

Lösung

Wenn die Objekte gefüllt werden sind einfach Bohnen kann es eine gute Idee, bei Apache gemeinsam der BeanUtils Klasse suchen sein. Das Bestücken () -Methode können die beschriebenen Fälle entsprechen. Im Allgemeinen Dependency Injection-Frameworks wie Spring kann sehr nützlich sein, aber das ist vielleicht nicht Antwort für das aktuelle Problem sein. Für die Eingabe in Form von XML, JiBX könnte eine gute Alternative sein, so würde 1,0 jaxb werden.

Andere Tipps

Verwenden Sie einfach XStream (für XML oder Sie können einen Versuch zu JSON geben).

Aber ...

Man, ich kann einfach nicht vermeiden, dass zu denken, die Testdaten außerhalb der Einheit Prüfstand selbst werden Sie zu unleserlich Tests führt. Sie müssen zwei Dateien suchen, wenn ein Testfall gelesen haben, werden Sie Refactoring-Tools verlieren (wenn Eigenschaft Name ändern). Jay Felder kann es besser erklären als ich:

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

Mit freundlichen Grüßen

Sie können es versuchen, um den deefault XMLEncoder / XMLDecoder, die in Java1.4 zur Plattform hinzugefügt wurden

Hier ist die Art, wie ich es verwenden.

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();
           }
       }
    }

}

Es ist einfach, ist einfach, ist in den Kernbibliotheken.

Sie müssen nur die Last Mechanismus schreiben.

Ich habe diese Swing-Anwendung, die in 5-Daten von einem Remote-EJB lädt - 10 Sek. Was ich tue, ist die vorherige Sitzung in XML so zu speichern, und wenn die App lädt sie hat alle Daten aus der vorherigen Sitzung in weniger als 1 Sekunde.

Während der Benutzer mit der App zu arbeiten beginnen, ein Hintergrund-Thread ruft die Elemente, die seit der letzten Sitzung geändert haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top