Какие библиотеки я могу использовать, чтобы связать POJO с внешними файлами для TDD без особых накладных расходов? - PullRequest
0 голосов
/ 12 октября 2008

Мне нужен способ привязки объектов POJO к внешнему объекту, который может быть XML, YAML, структурированный текст или что-либо простое в написании и обслуживании, чтобы создавать Mock-данные для модульного тестирования и TDD. Ниже приведены некоторые библиотеки, которые я пробовал, но основные проблемы с ними заключались в том, что я застрял (как минимум на 3 месяца) в Java 1.4. Я хотел бы получить представление о том, что я мог бы использовать вместо этого, с минимальными накладными расходами и предварительной настройкой (например, используя схемы или DTD) и без сложного XML. Вот библиотеки, которые мне действительно нравятся (но они, очевидно, не работают с 1.4 или не поддерживают конструкторы - у вас должны быть сеттеры):

RE-JAXB (или действительно простые 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.

Помните, что я хотел бы, насколько это возможно, избегать написания дескрипторов данных, я хотел бы что-то, что "просто работает".

У вас есть предложения?

Ответы [ 3 ]

1 голос
/ 12 октября 2008

Если объекты, которые должны быть заполнены, являются простыми bean-компонентами, возможно, было бы неплохо взглянуть на класс beanUtils apache common. Метод populate () может соответствовать описанным случаям. Как правило, структуры внедрения зависимостей, такие как Spring, могут быть очень полезны, но это не может быть решением текущей проблемы. Для ввода в форме xml, jibx может быть хорошей альтернативой, так же как и jaxb 1.0.

0 голосов
/ 13 октября 2008

Вы можете попробовать его по умолчанию для XMLEncoder / XMLDecoder, который был добавлен в платформу в Java1.4

Вот как я это использую.

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 секунд. Что я делаю, так это для того, чтобы сохранить предыдущий сеанс в XML, как это, и когда приложение загружает, оно содержит все данные предыдущего сеанса менее чем за 1 секунду.

Пока пользователь начинает работать с приложением, фоновый поток извлекает те элементы, которые изменились со времени последнего сеанса.

0 голосов
/ 12 октября 2008

Просто используйте XStream (для XML или вы можете попробовать JSON).

Но ...

Чувак, я просто не могу не думать, что размещение тестовых данных вне самого модульного теста приведет вас к нечитаемым тестам. При чтении тестового примера вам нужно будет посмотреть два файла, вы потеряете инструменты рефакторинга (при изменении имени свойства). Джей Филдс может объяснить это лучше меня:

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

С уважением

...