我需要一种方法将POJO对象绑定到外部实体,可以是XML,YAML,结构化文本或任何易于编写和维护的内容,以便为单元测试和TDD创建模拟数据。下面是我尝试过的一些库,但是它们的主要问题是我被困(至少3个月以上)到Java 1.4。我想要了解我可以使用的任何见解,尽可能低开销和前期设置(例如使用Schema或DTD),没有复杂的XML。这是我真正喜欢的库(但显然不适用于1.4或不支持构造函数 - 你必须有setter):
RE-JAXB(或非常简单的Java XML绑定)
http://jvalentino.blogspot.com/2008/07/in-response-to-easiest-java-xml-binding.html http://sourceforge.net/projects/rejaxb/
Seamlessy绑定了这个:
<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解析。
请记住,我想尽可能避免 - 编写数据描述符,我想要一些“只是有效”的东西。
你有什么建议吗?
答案 0 :(得分:1)
如果要填充的对象是简单的bean,那么查看apache common的BeanUtils类可能是个好主意。 populate()方法可能适合所描述的情况。通常像Spring这样的依赖注入框架非常有用,但这可能不是当前问题的答案。对于xml形式的输入,jibx可能是一个很好的选择,因此jaxb 1.0。
答案 1 :(得分:0)
只需使用XStream(对于XML,或者您可以尝试使用JSON)。
但是...
男人,我无法避免认为将测试数据置于单元测试之外会导致您进行不可读的测试。在阅读测试用例时,您将需要查看两个文件,您将失去重构工具(更改属性的名称时)。 Jay Fields可以比我更好地解释它:
http://blog.jayfields.com/2007/06/testing-inline-setup.html
亲切的问候
答案 2 :(得分:0)
您可以尝试使用Java1.4中添加到平台的deefault 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();
}
}
}
}
这很容易,很简单,就在核心库中。
您只需编写加载机制即可。
我有这个swing应用程序,可以在5到10秒内从远程EJB加载数据。我所做的是将上一个会话存储在这样的XML中,当应用程序加载时,它会在不到1秒的时间内完成上一个会话中的所有数据。
当用户开始使用应用程序时,后台线程会获取自上次会话以来已更改的元素。