Eduardo, estoy totalmente de acuerdo contigo y ahora te comento como
abordo este problema normalmente, pero antes quería explicar lo que se
pretende probar porque no lo he dejado claro.
El problema consiste en deserializar un xml para obtener un objeto y
lo que se pretende probar es que la deserialización se realiza bien.
El cómo se crea la cadena
xml que se quiere deserializar no tiene sentido y para mi lo más
práctico es escribir un literal en xml frente a usar builders o
ficheros externos.
Te planteo un ejemplo sencillo para que lo veas más claro en código.
Vamos a suponer que tenemos una revista que se compone de artículos y
que estos artículos
pueden contener referencias a otros artículos:
Su representación en xml podría ser la siguiente:
<magazine>
<title></title>
<description></description>
<articles>
<article>
<title></title>
<text></text>
<reference ref=""></>
</article>
</articles>
</magazine>
Para deserializar este ejemplo plantearísmos tres clases:
MagazineParser, AttributeParser y ReferenceParser todos cumpliendo la
interfaz de un IParser tener la siguiente forma.
interface IParser<T> {
T parser(String xml);
}
Como bien comentabas se deberían repartir la responsabilidad entre
objetos, así cada uno tiene una sola responsabilidad y se pueden
probar y mantener por separado. Así por ejemplo, el magazineParser
delega al ArticleParser la descerialización de un artículo y este
delega al ReferenceParser la descerialización de una referencia. Si
quieres, esta colaboración la puedes especificar en los test antes de
implementar los parsers.
Y Bueno un test quedaría así.
testSerializeArticleWithoutReferences() {
xml = "<article><title>abc</title><text></text></article>";
Article article =
parser.parse(xml);testSerializeArticleWithOneReference() {
xml = "<article> ... <referemce ref=""></reference></article>";
Article article = parser.parse(xml);
referenceParser = mock(ReferenceParser.class);
assertEquals("abc", article.getTitle());
}
Donde la variable xml es un literal concreto que quiero pasar al
parser.
Espero haberme explicado un poco mejor.
Gracias por la ayuda
Un saludo,
Yeray Caballero
On 26 oct, 17:20, Eduardo Ferrández <
eduardoferrand...@gmail.com>
wrote:
> Por lo que he entendido lo que se quiere es probar algo que se alimenta de
> XML, no la validez del XML.
>
> Esto es:
>
> testParseaNodoHijo() {
> xml = new NodoHijo().getXml();
> definition = parse.parse(xml)
>
> asserts sobre definition
>
> }
>
> testParseaRaiz() {
> xml = new NodoRaiz().getXml();
> definition = parse.parse(xml)
>
> asserts sobre definition
>
> }
>
> Creo que es una ventaja frente a guardarlo en literales o en ficheros porque
> así te permite probar desde los elementos hoja hasta el document root de
> forma independiente (el nodo raíz desconoce el xml del nodo hijo y no
> necesita saberlo porque se prueba en otro lugar) y evitas duplicar código.
>
> El 26 de octubre de 2010 18:03, jcesarperez <
>
julio.cesar.perez.arq...@gmail.com> escribió: