What libs can I use to bind POJOs to external files for TDD without much overhead?
I need a way to bind POJO objects to an external entity, that could be XML, YAML, structured text or anything easy to write and maintain in order to create Mock data for unit testing and TDD. Below are some libraries I tried, but the main problems with them were that I am stuck (for at least more 3 months) to Java 1.4. I'd like any insights on what I could use instead, with as low overhead and upfront setup (like using Schemas or DTDs, for instance) as possible and without complex XML. Here are the libraries I really like (but that apparently doesn't work with 1.4 or doesn't support constructors - you gotta have setters):
RE-JAXB (or Really Easy Java XML Bindings)
http://jvalentino.blogspot.com/2008/07/in-response-to-easiest-java-xml-binding.html http://sourceforge.net/projects/rejaxb/
Seamlessy binds this:
<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>
To this:
@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...
}
Using:
Rss rss = new Rss();
XmlBinderFactory.newInstance().bind(rss, new File("Rss2Test.xml"));
Problem: It relies on annotations, so no good for Java 1.4
jYaml http://jyaml.sourceforge.net/
Seamlessly binds this:
--- !user
name: Felipe Coury
password: felipe
modules:
- !module
id: 1
name: Main Menu
admin: !user
name: Admin
password: password
To this:
public class User {
private String name;
private String password;
private List modules;
}
public class Module {
private int id;
private String name;
private User admin;
}
Using:
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: It won't work with constructors (so no good for immutable objects). I'd have to either change my objects or write custom code por handling the YAML parsing.
Remember that I would like to avoid - as much as I can - writing data descriptors, I'd like something that "just works".
Do you have any suggestions?
Asked by: Walter155 | Posted: 23-01-2022
Answer 1
If the objects to be populated are simple beans it may be a good idea to look at apache common's BeanUtils class. The populate() method might suit the described cases. Generally dependency injection frameworks like Spring can be very useful, but that might not be answer for the current problem. For input in form of xml, jibx might be a good alternative, so would be jaxb 1.0.
Answered by: Emma918 | Posted: 24-02-2022Answer 2
Just use XStream (for XML or you could give a try to JSON).
But...
Man, I just can't avoid to think that put the test data outside the unit test itself will leads you to unreadable tests. You will need look two files when reading a test case, you will lose refactoring tools (when changing property's name). Jay Fields can explain it better than me:
http://blog.jayfields.com/2007/06/testing-inline-setup.html
Kind Regards
Answered by: Edgar257 | Posted: 24-02-2022Answer 3
You may give it a try to the deefault XMLEncoder/XMLDecoder that was added to the platform in Java1.4
Here's the way I use it.
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();
}
}
}
}
It's easy, is simple, is in the core libraries.
You just have to write the load mechanism.
I have this swing app that loads data from a remote EJB in 5 - 10 secs. What I do is to store the previous session in XML like this and when the app loads it has all the data from the previous session in less than 1 sec.
While the user start to work with the app, a background thread fetches those elements that have changed since the last session.
Answered by: Marcus102 | Posted: 24-02-2022Similar questions
What is the memory overhead of an object in Java?
This question already has answers here:
Java Memory Overhead
I would like to ask about Memory Overhead in java,
I have a large ArrayList (61,770 items), and trying to calculate the amount of memory taken by each item (counting the object and its ArrayList entry),
by profiling the app i get that after all the data is loaded, the heap takes ~ 25Mb.
when the ArrayList has only 2 items the heap takes ~1Mb , so roughly:
(24*1024*1024)/61,768 = 407 bytes.
however
java - How much "overhead" memory does JDOM need to generate XML files?
I need to use JDOM to generate XML files, which could be pretty big. I'm wondering how much additional memory space JDOM needs other than the data, mainly strings, that is already in the memory. I wrote a simple program to test and it turned out that the overhead is about twice as much as the XML content.
Does anybody know why JDOM needs that much additional memory and if there is a way I can optimize it? ...
java - Do Threads Add A Lot Of Overhead To An App?
As my app matures, I find myself finding more and more uses for threads. By now I must have about 25 threads, all doing important things and working together in symphony.
I notice however that my app is sitting around 15.5MB resident. Compared to the browser (+/-35MB) I feel pretty safe, but I do notice the resident size of my app ever increasing.
The question is, how much overhead is involved with adding...
java - GC Overhead limit exceeded error when reading a text file
I am getting java.lang.OutOfMemoryError: GC overhead limit exceeded error when reading from a text file.I am not sure what is going wrong.I am running my program on a cluster having sufficient memory.The outer loop iterates for 16000 times and for each iteration of the outer loop the inner loop iterates for about 300,000 times.The error is thrown when the code tries to read a line from the inner loop.Any suggestions will b...
java - GC overhead limit exceeded
What is the sampling time JVM uses to throw 'java.lang.OutOfMemoryError : GC overhead limit exceeded'?
I know you can control 98% and 2% with parameters GCTimeLimit and GCHeapFreeLimit but whats the sampling time?
java - How much overhead is using emulated stack in GWT?
I'm considering using GWT's emulated stack in web-mode and I wanted to hear, based on people's experience how much performance overhead it added?
From what I read in the above link all of the overhead is the couple of arrays and their handling as a stack which is very reasonable in my eyes.
I jus...
java - How large is the -Xdebug flag overhead?
I wonder how large the performance overhead that the -Xdebug flag introduces?
It's very convenient to debug production applications, but I guess it is expensive to leave running all the time?
Also, is there a good way to make the already running application to listen via Debug port, without re-launching it?
Thanks.
Java logging API overhead
I've read a bit about the various ways of logging a debugging message with Java, and coming from a C background my concern is as follow :
Those libraries claim minimal overhead in case where logging is disabled (such as production environment), but since argument to their log() function are still evaluated, my concern is that the overhead in real-world scenario will, in fact, not be negligible at all....
java - is there an overhead on setting a JVM to listen to debug port?
I want to be able to debug production systems with jdwp.
for this I want to add -Xdebug -Xrunjdwp:transport=dt_socket,address=11122,server=y,suspend=n to each java process I am starting.
Is there any overhead for that in case the port is not activated?
is my JVM going to run slower in this case?
Still can't find your answer? Check out these amazing Java communities for help...
Java Reddit Community | Java Help Reddit Community | Dev.to Java Community | Java Discord | Java Programmers (Facebook) | Java developers (Facebook)