<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://dosideas.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Uva</id>
		<title>Dos Ideas. - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://dosideas.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Uva"/>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/Especial:Contribuciones/Uva"/>
		<updated>2026-04-27T16:54:26Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=HSQLDB&amp;diff=6615</id>
		<title>HSQLDB</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=HSQLDB&amp;diff=6615"/>
				<updated>2012-05-23T14:32:52Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Categoría: Base De Datos]]&lt;br /&gt;
[[Categoría: Java]]&lt;br /&gt;
&lt;br /&gt;
HSQLDB es una [[Base De Datos]] creada completamente en [[Java]], liviana y rápida.&lt;br /&gt;
&lt;br /&gt;
== Problemas con la hora de la JVM ==&lt;br /&gt;
&lt;br /&gt;
===Objetivo===&lt;br /&gt;
Obtener la fecha del sistema en un script de HSQLDB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Contexto===&lt;br /&gt;
* Script  HSQLDB en test de componentes.&lt;br /&gt;
* Versión de jdk inferior a 1.7.0_04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Problema===&lt;br /&gt;
&lt;br /&gt;
* Al momento de utilizar la función '''sysdate''' para obtener la fecha del sistema desde el script, el resultado que obteníamos no era el esperado. la fecha que retornaba correspondía al día siguiente al que teníamos configurado en la pc. &lt;br /&gt;
&lt;br /&gt;
* Mirando con mayor detenimiento, pudimos constatar que esto nos sucedía para todas las funciones similares (CURRENT_DATE,TODAY, NOW, etc)&lt;br /&gt;
&lt;br /&gt;
* Usando las funciones CURRENT_TIME y CURRENT_TIMESTAMP vimos que en realidad lo que estaba sucediendo es que había una diferencia de +15 horas con la real de la pc.&lt;br /&gt;
&lt;br /&gt;
* Esto se debía a que la jvm tomaba por default el huso horario de Asia/Magadan.&lt;br /&gt;
&lt;br /&gt;
===Solución===&lt;br /&gt;
&lt;br /&gt;
* Instalamos la última versión de la jdk disponible en la web (jdk1.7.0_04)&lt;br /&gt;
* Nos aseguramos que el huso horario configurado en la pc sea &amp;quot;Buenos Aires/Georgetown&amp;quot; &lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [http://www.hsqldb.org/ Web oficial de HSQLDB ]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:EjemploGuavaComparacionListas.gif&amp;diff=6614</id>
		<title>Archivo:EjemploGuavaComparacionListas.gif</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:EjemploGuavaComparacionListas.gif&amp;diff=6614"/>
				<updated>2012-05-23T14:26:04Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Ejemplo_con_Google_Guava_Comparator&amp;diff=6613</id>
		<title>Ejemplo con Google Guava Comparator</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Ejemplo_con_Google_Guava_Comparator&amp;diff=6613"/>
				<updated>2012-05-23T14:25:01Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: Página creada con '=Objetivo=  * Encontrar una manera de organizar listas de una determinada entidad, por un conjunto de campos específico, de manera de poder tener múltiples criterios de ordena…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Objetivo=&lt;br /&gt;
&lt;br /&gt;
* Encontrar una manera de organizar listas de una determinada entidad, por un conjunto de campos específico, de manera de poder tener múltiples criterios de ordenamiento sobre la misma clase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Situación ejemplo=&lt;br /&gt;
&lt;br /&gt;
* Tenemos una clase Tarea&lt;br /&gt;
* Tarea está asociada a un Usuario&lt;br /&gt;
* Tarea tiene una fecha.&lt;br /&gt;
* Usuario tiene dos String que representan  el nombre y apellido respectivamente.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:EjemploGuavaComparacionListas.gif]]&lt;br /&gt;
&lt;br /&gt;
* Tenemos que ordenar una '''List&amp;lt;Tarea&amp;gt;''' , por apellido y nombre del usuario relacionado, y fecha de la tarea.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==SIN Guava==&lt;br /&gt;
&lt;br /&gt;
* Deberíamos crear una clase '''TareaComparator''' que implemente '''Comparator&amp;lt;Tarea&amp;gt;''', &lt;br /&gt;
poniendo en el siguiente método:&lt;br /&gt;
  &lt;br /&gt;
    @Override&lt;br /&gt;
    public int compare(Tarea t1, Tarea t2) {&lt;br /&gt;
 		//código armando el criterio de ordenamiento de cada tarea&lt;br /&gt;
                //aca se deberia armar/concatenar todos los criterios en uno solo, obteniendo tareaCriterio1 y tareaCriterio2&lt;br /&gt;
 		return tareaCriterio1.compareTo(tareaCriterio2);&lt;br /&gt;
     }&lt;br /&gt;
	&lt;br /&gt;
* Luego en nuestro código de negocio, al momento de ordenar deberíamos invocar a Collections.sort(lista, tareaComparator)&lt;br /&gt;
&lt;br /&gt;
* De dicha manera, si quisiéramos tener otro criterio de ordenamiento, deberíamos tener una clase por cada criterio distinto de ordenamiento.&lt;br /&gt;
&lt;br /&gt;
==CON librerías de [[http://code.google.com/p/guava-libraries/| Guava ]] ==&lt;br /&gt;
&lt;br /&gt;
* Crear la clase '''TareaComparator''', sin implementar ninguna interfaz.&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor privado.&lt;br /&gt;
     */&lt;br /&gt;
    private TareaComparator() {&lt;br /&gt;
     }&lt;br /&gt;
     /**&lt;br /&gt;
      * Ordena tarea por nombre de usuario.&lt;br /&gt;
      */&lt;br /&gt;
     private static Comparator&amp;lt;Tarea&amp;gt; byNombre = new Comparator&amp;lt;Tarea&amp;gt;() { &lt;br /&gt;
         @Override&lt;br /&gt;
         public int compare(final Tarea p1, final Tarea p2) {&lt;br /&gt;
             return p1.getUsuario().getNombre().compareTo(p2.getUsuario().getNombre());&lt;br /&gt;
         }&lt;br /&gt;
     };&lt;br /&gt;
     /**&lt;br /&gt;
     * Ordena tarea por apellido de usuario.&lt;br /&gt;
     */&lt;br /&gt;
     private static Comparator&amp;lt;Tarea&amp;gt; byApellido = new Comparator&amp;lt;Tarea&amp;gt;() { &lt;br /&gt;
         @Override&lt;br /&gt;
         public int compare(final Tarea p1, final Tarea p2) {&lt;br /&gt;
             return p1.getUsuario().getApellido().compareTo(p2.getUsuario().getApellido());&lt;br /&gt;
         }&lt;br /&gt;
     }; &lt;br /&gt;
      /**&lt;br /&gt;
      * Ordena tarea por fecha.&lt;br /&gt;
      */&lt;br /&gt;
      private static Comparator&amp;lt;Tarea&amp;gt; byFecha = new Comparator&amp;lt;Tarea&amp;gt;() {&lt;br /&gt;
          @Override&lt;br /&gt;
          public int compare(final Tarea p1, final Tarea p2) {&lt;br /&gt;
              return p1.getFecha().compareTo(p2.getFecha());&lt;br /&gt;
          }&lt;br /&gt;
      };&lt;br /&gt;
      /**&lt;br /&gt;
      * @return byNombre&lt;br /&gt;
      */&lt;br /&gt;
      public static Comparator&amp;lt;Tarea&amp;gt; getByNombre() {&lt;br /&gt;
         return byNombre;&lt;br /&gt;
     }&lt;br /&gt;
     /**&lt;br /&gt;
      * @return byApellido&lt;br /&gt;
      */&lt;br /&gt;
     public static Comparator&amp;lt;Tarea&amp;gt; getByApellido() {&lt;br /&gt;
        return byApellido;&lt;br /&gt;
     }&lt;br /&gt;
     /**&lt;br /&gt;
      * @return byFecha&lt;br /&gt;
      */&lt;br /&gt;
     public static Comparator&amp;lt;Tarea&amp;gt; getByFecha() {&lt;br /&gt;
         return byFecha;&lt;br /&gt;
     }&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
* Luego en nuestro código de negocio, al momento de ordenar deberíamos usar:&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
 	List&amp;lt;Tarea&amp;gt; tareasOrdenadas = Ordering.from(TareaComparator.getByApellido())&lt;br /&gt;
 					.compound(TareaComparator.getByNombre())&lt;br /&gt;
 					.compound(TareaComparator.getByFecha())&lt;br /&gt;
 					.sortedCopy(tareasDesordenadas);&lt;br /&gt;
	&lt;br /&gt;
* De esta manera, podemos anidar criterios de ordenamiento, combinándolos de las maneras que necesitemos, teniendo las comparaciones agrupadas en una sola clase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Google_Guava&amp;diff=6612</id>
		<title>Google Guava</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Google_Guava&amp;diff=6612"/>
				<updated>2012-05-23T14:23:36Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://code.google.com/p/guava-libraries/  Google Guava] es un proyecto de Google que reúne un conjunto de librerías usadas internamente dentro de Google para sus proyectos que emplean Java. El propósito de la librería es simplificar el código empleado para realizar tareas que son comunes dentro de [[Java]] y que no están soportadas por las librerías estándar, de esta manera busca eliminar código propenso a errores.&lt;br /&gt;
&lt;br /&gt;
== Maven ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
   &amp;lt;groupId&amp;gt;com.google.guava&amp;lt;/groupId&amp;gt;&lt;br /&gt;
   &amp;lt;artifactId&amp;gt;guava&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
   &amp;lt;version&amp;gt;r09&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Controlara última versión [http://mvnrepository.com/artifact/com.google.guava/guava aquí].&lt;br /&gt;
&lt;br /&gt;
== Ejemplos ==&lt;br /&gt;
&lt;br /&gt;
===CharMatcher===&lt;br /&gt;
&lt;br /&gt;
Determina verdadero o falso para cualquier carácter java, también ofrece  métodos básicos de tratamiento de texto.&lt;br /&gt;
&lt;br /&gt;
==== and / or ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String input = &amp;quot;La fecha es : 01/01/2011&amp;quot;;&lt;br /&gt;
CharMatcher charMatcher = CharMatcher.DIGIT.or(CharMatcher.is('/'));&lt;br /&gt;
String output = charMatcher.retainFrom(input);&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida : 01/01/2011&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== negate ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String input = &amp;quot;MAYUSCULA minuscula&amp;quot;;&lt;br /&gt;
CharMatcher charMatcher = CharMatcher.JAVA_LOWER_CASE.or(CharMatcher.WHITESPACE).negate();&lt;br /&gt;
String output = charMatcher.retainFrom(input);&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: MAYUSCULA&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== inRange ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String input = &amp;quot;Solo quedan los numeros 1, 2, 3, 4 que son menores a  5 &amp;quot;;&lt;br /&gt;
CharMatcher charMatcher = CharMatcher.inRange('0', '4').or(CharMatcher.WHITESPACE);&lt;br /&gt;
String output = charMatcher.retainFrom(input);&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: 1 2 3 4&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Joiner ===&lt;br /&gt;
&lt;br /&gt;
Une fragmentos de texto mediante un separador. también ofrece métodos básicos de tratamiento de texto.&lt;br /&gt;
&lt;br /&gt;
==== join ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String[] nombres = {&amp;quot;Josefina&amp;quot;, &amp;quot;Nacho&amp;quot;, &amp;quot;Lali&amp;quot;, &amp;quot;Coco&amp;quot;};&lt;br /&gt;
String output = Joiner.on(&amp;quot;, &amp;quot;).join(nombres);&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: Josefina, Nacho, Lali, Coco&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== skipNulls ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String[] nombres = {null, &amp;quot;Josefina&amp;quot;, null, &amp;quot;Nacho&amp;quot;, null, &amp;quot;Lali&amp;quot;, null, &amp;quot;Coco&amp;quot;};&lt;br /&gt;
String output = Joiner.on(&amp;quot;, &amp;quot;).skipNulls().join(nombres);&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: Josefina, Nacho, Lali, Coco&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== useForNull ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String[] nombres = {null, &amp;quot;Josefina&amp;quot;, null, &amp;quot;Nacho&amp;quot;, null, &amp;quot;Lali&amp;quot;, null, &amp;quot;Coco&amp;quot;};&lt;br /&gt;
String output = Joiner.on(&amp;quot;, &amp;quot;).useForNull(&amp;quot;n/a&amp;quot;).join(nombres);&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: n/a, Josefina, n/a, Nacho, n/a, Lali, n/a, Coco&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== withKeyValueSeparator ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Map&amp;lt;Integer, String&amp;gt; map = newHashMap();&lt;br /&gt;
map.put(1, &amp;quot;Josefina&amp;quot;);&lt;br /&gt;
map.put(2, &amp;quot;Nacho&amp;quot;);&lt;br /&gt;
map.put(3, &amp;quot;Lali&amp;quot;);&lt;br /&gt;
String output = Joiner.on(&amp;quot;, &amp;quot;).withKeyValueSeparator(&amp;quot; -&amp;gt; &amp;quot;).join(map);&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: 1 -&amp;gt; Josefina, 2 -&amp;gt; Nacho, 3 -&amp;gt; Lali&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Splitter ===&lt;br /&gt;
&lt;br /&gt;
Divide cadenas de texto en subcadenas mediante el reconocimiento de un separador (también conocido como delimitador), este se puede definir mediante un carácter, una cadena literal, una expresión regular, un CharMatcher, o mediante el uso de una longitud fija.&lt;br /&gt;
&lt;br /&gt;
==== split ====&lt;br /&gt;
&lt;br /&gt;
Split retorna una instancia de Iterable en lugar de un Array.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String input = &amp;quot;Josefina|Nacho|Lali&amp;quot;;&lt;br /&gt;
Iterable&amp;lt;String&amp;gt; split = Splitter.on(&amp;quot;|&amp;quot;).split(input);&lt;br /&gt;
List&amp;lt;String&amp;gt; output = newArrayList(split);&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: [Josefina, Nacho, Lali]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== fixedLength ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String input =&amp;quot;Josefina  Nacho     Lali      &amp;quot;;&lt;br /&gt;
Iterable&amp;lt;String&amp;gt; splitted = Splitter.fixedLength(10).trimResults().split(input);&lt;br /&gt;
List&amp;lt;String&amp;gt; output = newArrayList(splitted);&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
//Salida: [Josefina, Nacho, Lali]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== onPattern ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String input =&amp;quot;Josefina Nacho Lali&amp;quot;;&lt;br /&gt;
Iterable&amp;lt;String&amp;gt; splitted = &lt;br /&gt;
            Splitter.onPattern(&amp;quot;[a-z&amp;amp;&amp;amp;[aeiou]]&amp;quot;).omitEmptyStrings().split(input);&lt;br /&gt;
List&amp;lt;String&amp;gt; output = newArrayList(splitted);&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: [J, s, f, n,  N, ch,  L, l]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Collection2 ===&lt;br /&gt;
&lt;br /&gt;
Proporciona métodos estáticos para trabajar con colecciones.&lt;br /&gt;
&lt;br /&gt;
==== filter ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
List&amp;lt;String&amp;gt; input = newArrayList(&amp;quot;Josefina&amp;quot;,&amp;quot;Nacho&amp;quot;,&amp;quot;Lali&amp;quot;);&lt;br /&gt;
Collection&amp;lt;String&amp;gt; output = &lt;br /&gt;
     Collections2.filter(input, new Predicate&amp;lt;String&amp;gt;() {&lt;br /&gt;
&lt;br /&gt;
                public boolean apply(String t) {&lt;br /&gt;
                    if (t.contains(&amp;quot;i&amp;quot;)) {&lt;br /&gt;
                        return true;&lt;br /&gt;
                    }&lt;br /&gt;
                    return false;&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: [Josefina, Lali]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== transform ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
List&amp;lt;String&amp;gt; input = newArrayList(&amp;quot;Josefina&amp;quot;, &amp;quot;Nacho&amp;quot;, &amp;quot;Lali&amp;quot;);&lt;br /&gt;
Collection&amp;lt;String&amp;gt; output = &lt;br /&gt;
     Collections2.transform(input, new Function&amp;lt;String, String&amp;gt;() {&lt;br /&gt;
&lt;br /&gt;
            public String apply(String f) {&lt;br /&gt;
                return f.replaceAll(&amp;quot;fina&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: [Jose, Nacho, Lali]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Constraints ===&lt;br /&gt;
&lt;br /&gt;
Restringe la carga de las colecciones medinate limitaciones.&lt;br /&gt;
&lt;br /&gt;
==== constrainedCollection ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Constraint&amp;lt;String&amp;gt; debeContenerJoL = new Constraint&amp;lt;String&amp;gt;() {&lt;br /&gt;
&lt;br /&gt;
     @Override&lt;br /&gt;
     public String checkElement(String s) {&lt;br /&gt;
       checkNotNull(s);&lt;br /&gt;
       if (!s.contentEquals(&amp;quot;JL&amp;quot;)) {&lt;br /&gt;
         throw new IllegalArgumentException(&amp;quot;No contiene J ni L&amp;quot;);&lt;br /&gt;
       }&lt;br /&gt;
       return s;&lt;br /&gt;
     }&lt;br /&gt;
};&lt;br /&gt;
        &lt;br /&gt;
Collection&amp;lt;String&amp;gt; input = newArrayList(&amp;quot;Josefina&amp;quot;);&lt;br /&gt;
Collection&amp;lt;String&amp;gt; output = constrainedCollection(input, debeContenerJoL);&lt;br /&gt;
output.add(&amp;quot;Nacho&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Salida:&lt;br /&gt;
Exception in thread &amp;quot;main&amp;quot; java.lang.IllegalArgumentException: No contiene J ni L&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Collection&amp;lt;String&amp;gt; input = newArrayList(&amp;quot;Josefina&amp;quot;);&lt;br /&gt;
Collection&amp;lt;String&amp;gt; output = constrainedCollection(input, notNull());&lt;br /&gt;
output.add(null);&lt;br /&gt;
&lt;br /&gt;
// Salida:&lt;br /&gt;
Exception in thread &amp;quot;main&amp;quot; java.lang.NullPointerException&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ordering ===&lt;br /&gt;
&lt;br /&gt;
Comparador con métodos para soportar funciones comunes.&lt;br /&gt;
&lt;br /&gt;
==== sortedCopy ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
List&amp;lt;String&amp;gt; input = newArrayList(&amp;quot;Josefina&amp;quot;,&amp;quot;Nacho&amp;quot;,&amp;quot;Lali&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Ordering&amp;lt;String&amp;gt; ordering = Ordering.from(new Comparator&amp;lt; String&amp;gt;() {&lt;br /&gt;
&lt;br /&gt;
        @Override&lt;br /&gt;
        public int compare(String string1, String string2) {&lt;br /&gt;
             return Ints.compare(string1.length(), string2.length());&lt;br /&gt;
                &lt;br /&gt;
        }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
List&amp;lt;String&amp;gt; output = ordering.sortedCopy(input);&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: [Lali, Nacho, Josefina]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Multimap ===&lt;br /&gt;
&lt;br /&gt;
Basicamente es un map en el que se pueden asignar muchos valores a una sola clave.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Multimap&amp;lt;Integer, String&amp;gt; output = HashMultimap.create();&lt;br /&gt;
        output.put(1, &amp;quot;Josefina&amp;quot;);&lt;br /&gt;
        output.put(2, &amp;quot;nacho&amp;quot;);&lt;br /&gt;
        output.put(3, &amp;quot;Lali&amp;quot;);&lt;br /&gt;
        output.put(1, &amp;quot;Josefina_2&amp;quot;); &lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: {1=[Josefina, Josefina_2], 2=[Bacho], 3=[lali]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ImmutableSetMultimap ====&lt;br /&gt;
&lt;br /&gt;
===== inline =====&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Multimap&amp;lt;Integer, String&amp;gt; output = &lt;br /&gt;
ImmutableSetMultimap.of(1, &amp;quot;Josefina&amp;quot;, 2, &amp;quot;Nacho&amp;quot;, 3, &amp;quot;Lali&amp;quot;, 1, &amp;quot;Josefina_2&amp;quot;); &lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: {1=[Josefina, Josefina_2], 2=[Nacho], 3=[Lali]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== builder =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Multimap&amp;lt;Integer, String&amp;gt; output = &lt;br /&gt;
                new ImmutableSetMultimap.Builder&amp;lt;Integer, String&amp;gt;()&lt;br /&gt;
                    .put(1, &amp;quot;Josefina&amp;quot;)&lt;br /&gt;
                    .put(2, &amp;quot;Nacho&amp;quot;)&lt;br /&gt;
                    .put(3, &amp;quot;Lali&amp;quot;)&lt;br /&gt;
                    .put(1, &amp;quot;Josefina_2&amp;quot;)&lt;br /&gt;
                    .build();&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
&lt;br /&gt;
// Salida: {1=[Josefina, Josefina_2], 2=[Bacho], 3=[Lali]}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tables ===&lt;br /&gt;
&lt;br /&gt;
Es una colección con columnas filas y valores. Permite el traspaso de una tabla a otra.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
Table&amp;lt;Integer, String, String&amp;gt; table = HashBasedTable.create();&lt;br /&gt;
table.put(1, &amp;quot;Hija&amp;quot;, &amp;quot;Josefina&amp;quot;);&lt;br /&gt;
table.put(1, &amp;quot;Sobrino&amp;quot;, &amp;quot;Nacho&amp;quot;);&lt;br /&gt;
table.put(1, &amp;quot;Pareja&amp;quot;, &amp;quot;Lali&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
Table output = Tables.transpose(table);&lt;br /&gt;
&lt;br /&gt;
System.out.println(output);&lt;br /&gt;
        &lt;br /&gt;
// Salida: {Sobrino={1=Nacho}, Hija={1=Josefina}, Pareja={1=Lali}}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BiMap ===&lt;br /&gt;
&lt;br /&gt;
Es un Map que solo permite valores únicos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
BiMap&amp;lt;Integer, String&amp;gt; output = HashBiMap.create();&lt;br /&gt;
output.put(1, &amp;quot;Josefina&amp;quot;);&lt;br /&gt;
output.put(2, &amp;quot;Lali&amp;quot;);&lt;br /&gt;
output.put(3, &amp;quot;Josefina&amp;quot;); //IllegalArgumentException&lt;br /&gt;
&lt;br /&gt;
// Salida:&lt;br /&gt;
Exception in thread &amp;quot;main&amp;quot; java.lang.IllegalArgumentException: value already present: Josefina&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Throwables ===&lt;br /&gt;
&lt;br /&gt;
Clase utilitaria que contiene métodos estáticos para el manejo de excepciones. &lt;br /&gt;
&lt;br /&gt;
==== propagate ====&lt;br /&gt;
&lt;br /&gt;
En el caso de que la excepción sea del tipo RuntimeException la lanza, de lo contrario crea una RuntimeException con la excepción recibida y la lanza.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
    try {&lt;br /&gt;
      throw new Exception(&amp;quot;Error !!!&amp;quot;);&lt;br /&gt;
    } catch (Throwable t) {&lt;br /&gt;
      throw Throwables.propagate(t);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// Salida: &lt;br /&gt;
Exception in thread &amp;quot;main&amp;quot; java.lang.RuntimeException: java.lang.Exception: Error !!!&lt;br /&gt;
	at com.google.common.base.Throwables.propagate(Throwables.java:155)&lt;br /&gt;
	at com.dosideas.guavalibrarydemo.Ejemplo.main(Ejemplo.java:92)&lt;br /&gt;
Caused by: java.lang.Exception: Error !!!&lt;br /&gt;
	at com.dosideas.guavalibrarydemo.Ejemplo.main(Ejemplo.java:90)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
&lt;br /&gt;
Clase con métodos útiles para el manejo de archovs.&lt;br /&gt;
&lt;br /&gt;
==== readLines ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
ClassLoader cla = App.class.getClassLoader();&lt;br /&gt;
File file = new File(cla.getResource(&amp;quot;prueba.txt&amp;quot;).getFile());&lt;br /&gt;
List&amp;lt;String&amp;gt; lines = Files.readLines(file, Charsets.UTF_8);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Ejemplo con Google Guava Comparator]]&lt;br /&gt;
* [http://code.google.com/p/dosideas-aplicaciones-modelo/source/browse/#svn Descargar con svn de nuestro proyecto en google-code la aplicación demo de Google Guava]&lt;br /&gt;
* [http://www.javacodegeeks.com/2011/09/google-guava-libraries-essentials.html Google Guava Libraries Essentials]&lt;br /&gt;
* [http://guava-libraries.googlecode.com/svn/tags/release09/javadoc/index.html Google Guava API]&lt;br /&gt;
&lt;br /&gt;
[[Category:Java]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Prueba_De_Integracion_Dummy_con_Ant&amp;diff=6435</id>
		<title>Prueba De Integracion Dummy con Ant</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Prueba_De_Integracion_Dummy_con_Ant&amp;diff=6435"/>
				<updated>2011-11-15T21:08:51Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En diferentes oportunidades nos surge la necesidad de realizar pruebas de Integración contra servidores o servicios que no están disponibles por X motivo. &lt;br /&gt;
&lt;br /&gt;
Este es un ejemplo de solución para un servicio que consume un Conector, el cuál le pega a una plataforma que no está disponible. Utilizando una clase Mock y un poco de ant, podemos generar un distribuible que nos sirva para probar el servicio de manera Mock. &lt;br /&gt;
&lt;br /&gt;
== Contexto  ==&lt;br /&gt;
&lt;br /&gt;
Supongamos que tenemos un servicio que estamos exponiendo, que internamente se comunica con un conector mediante una librería cliente. Lo hace mediante este Dao &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5=&amp;quot;java5&amp;quot;&amp;gt;&lt;br /&gt;
@Repository&lt;br /&gt;
public class ConectorDaoImpl implements ConectorDao {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Conector delegate.&lt;br /&gt;
     */&lt;br /&gt;
    @Autowired&lt;br /&gt;
    private ConnectorRemoteBusiness conector;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * @{@inheritDoc}.&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    public void llamarAConector(String parametro)  {&lt;br /&gt;
        // código... &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Ahora supongamos que para nuestros test de componentes nos generemos una implementación mock del cliente del conector, para manejar datos dummy para nuestras pruebas: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5=&amp;quot;java5&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public class ConnectorRemoteBusinessMock implements ConnectorRemoteBusiness {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public String invocarConector(String parametro) throws RemoteException {&lt;br /&gt;
        String respuesta = null;&lt;br /&gt;
&lt;br /&gt;
        switch (parametro) {&lt;br /&gt;
            case 1: respuesta = &amp;quot;Respuesa1&amp;quot; break;&lt;br /&gt;
            case 2: respuesta = &amp;quot;Respuesa2&amp;quot; break;&lt;br /&gt;
            case 3: respuesta = &amp;quot;Respuesa3&amp;quot; break;&lt;br /&gt;
            default: respuesta = &amp;quot;default&amp;quot;; break;&lt;br /&gt;
        }&lt;br /&gt;
        return respuesta;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Y en los test de componentes, configuramos Spring para que al Dao se le inyecte la implementación Mock. &lt;br /&gt;
&lt;br /&gt;
Ahora, supongamos que nuestro servidor sigue caído, y necesitamos generar un distribuible que utilice este Dao con la inyección del delegate mock. Podemos tunear las tareas ant para realizar dicha acción. Ahora vamos a ver como. &lt;br /&gt;
&lt;br /&gt;
== Generando el Distribuible Mock  ==&lt;br /&gt;
&lt;br /&gt;
La estructura del proyecto es la siguiente en este ejemplo: &lt;br /&gt;
&lt;br /&gt;
/src/java/com... &amp;amp;nbsp; &amp;amp;nbsp;Código del empaquetado &lt;br /&gt;
&lt;br /&gt;
/test/com/.... &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; Paquete de la clase Mock&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
/test/componentes/com... Código de los test de componentes.&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Vamos a generar una tarea ant a la cual llamaremos &amp;quot;dist-mock&amp;quot; que tendrá por salida un war con un Dao que utiliza una interface Mock del Cliente del conector. Para esto necesitamos copiar no solo la clase mock, sino el archivo de Spring para inyectarle este mock al dao. Y luego limpiar la clase mock de nuestro src. Veamos el código ant en un build.xml:&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Tareas para generar un distribuible mock --&amp;gt;&lt;br /&gt;
    &amp;lt;target name=&amp;quot;dist-mock&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;echo&amp;gt;Dist Mock&amp;lt;/echo&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;esMock&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;claseMock&amp;quot;&lt;br /&gt;
            value=&amp;quot;./test/componente/com/.../ConnectorRemoteBusinessMock.java&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;directorioDestino&amp;quot;&lt;br /&gt;
            value=&amp;quot;./src/java/com/.../ejb&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;ejb-xml-mock&amp;quot;&lt;br /&gt;
            value=&amp;quot;./test/componente/spring-ejb-Componente.xml&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;ant target=&amp;quot;dist&amp;quot; inheritall=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;target name=&amp;quot;-pre-compile&amp;quot; if=&amp;quot;esMock&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;echo&amp;gt;Pre compile Mock&amp;lt;/echo&amp;gt;&lt;br /&gt;
        &amp;lt;copy file=&amp;quot;${claseMock}&amp;quot; todir=&amp;quot;${directorioDestino}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;target name=&amp;quot;-post-compile&amp;quot; if=&amp;quot;esMock&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;echo&amp;gt;Post compile Mock&amp;lt;/echo&amp;gt;&lt;br /&gt;
        &amp;lt;copy file=&amp;quot;${ejb-xml-mock}&amp;quot; todir=&amp;quot;${build.classes.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;move file=&amp;quot;${build.classes.dir}/spring-ejb-Componente.xml&amp;quot;&lt;br /&gt;
            tofile=&amp;quot;${build.classes.dir}/spring-ejb.xml&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;target name=&amp;quot;-post-dist&amp;quot; if=&amp;quot;esMock&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;echo&amp;gt;Post dist Mock&amp;lt;/echo&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;./src/java/com/tm&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Ahora expliquemos un poco cada parte del ant.&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
#Primero, ejecutando la tarea dist-mock estamos diciendo explicitamente que queremos un distribuible mock. Esto es recomendado, ya que de sobrescribir la tarea dist, podemos olvidarnos y migrar cosas dummy. En la tarea dist-mock se setea en true una variable &amp;quot;esMock&amp;quot;. Despues nos guardamos un par de propiedades por simplicidad del código, y llamamos a la tarea dist.&amp;amp;nbsp; &lt;br /&gt;
#En el pre-compile estamos ubicados antes de que ant compile las clases. Este es el momento en donde copiamos la clase mock a nuestro src. &lt;br /&gt;
#En el post-compile, las clases ya estan compiladas, y llevamos nuestro archivo de componentes de spring a donde quedaron las clases compiladas, y lo renombramos para pisar el archivo spring de src &lt;br /&gt;
#Luego, en el post-dist, antes de terminar, limpiamos el src y borramos la clase mock que copiamos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Con esto tenemos un distribuible mock para hacer nuestras pruebas de &amp;quot;pseudo integración&amp;quot;, que pueden servirnos para avanzar con un desarrollo. Igual recuerden, que hasta no integrar nuestro código con los servicios reales, no deberíamos dar como terminado el mismo! Cuando antes fallemos en nuestro desarrollo, mas tiempo tendremos de resolver nuestros problemas.&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Prueba_De_Integracion_Dummy_con_Ant&amp;diff=6434</id>
		<title>Prueba De Integracion Dummy con Ant</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Prueba_De_Integracion_Dummy_con_Ant&amp;diff=6434"/>
				<updated>2011-11-15T21:06:22Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En diferentes oportunidades nos surge la necesidad de realizar pruebas de Integración contra servidores o servicios que no están disponibles por X motivo. &lt;br /&gt;
&lt;br /&gt;
Este es un ejemplo de solución para un servicio que consume un Conector, el cuál le pega a una plataforma que no está disponible. Utilizando una clase Mock y un poco de ant, podemos generar un distribuible que nos sirva para probar el servicio de manera Mock. &lt;br /&gt;
&lt;br /&gt;
== Contexto  ==&lt;br /&gt;
&lt;br /&gt;
Supongamos que tenemos un servicio que estamos exponiendo, que internamente se comunica con un conector mediante una librería cliente. Lo hace mediante este Dao &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5=&amp;quot;java5&amp;quot;&amp;gt;&lt;br /&gt;
@Repository&lt;br /&gt;
public class ConectorDaoImpl implements ConectorDao {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Conector delegate.&lt;br /&gt;
     */&lt;br /&gt;
    @Autowired&lt;br /&gt;
    private ConnectorRemoteBusiness conector;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * @{@inheritDoc}.&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    public void llamarAConector(String parametro)  {&lt;br /&gt;
        // código... &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Ahora supongamos que para nuestros test de componentes nos generemos una implementación mock del cliente del conector, para manejar datos dummy para nuestras pruebas: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5=&amp;quot;java5&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public class ConnectorRemoteBusinessMock implements ConnectorRemoteBusiness {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public String invocarConector(String parametro) throws RemoteException {&lt;br /&gt;
        String respuesta = null;&lt;br /&gt;
&lt;br /&gt;
        switch (parametro) {&lt;br /&gt;
            case 1: respuesta = &amp;quot;Respuesa1&amp;quot; break;&lt;br /&gt;
            case 2: respuesta = &amp;quot;Respuesa2&amp;quot; break;&lt;br /&gt;
            case 3: respuesta = &amp;quot;Respuesa3&amp;quot; break;&lt;br /&gt;
            default: respuesta = &amp;quot;default&amp;quot;; break;&lt;br /&gt;
        }&lt;br /&gt;
        return respuesta;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Y en los test de componentes, configuramos Spring para que al Dao se le inyecte la implementación Mock. &lt;br /&gt;
&lt;br /&gt;
Ahora, supongamos que nuestro servidor sigue caído, y necesitamos generar un distribuible que utilice este Dao con la inyección del delegate mock. Podemos tunear las tareas ant para realizar dicha acción. Ahora vamos a ver como. &lt;br /&gt;
&lt;br /&gt;
== Generando el Distribuible Mock  ==&lt;br /&gt;
&lt;br /&gt;
La estructura del proyecto es la siguiente en este ejemplo: &lt;br /&gt;
&lt;br /&gt;
/src/java/com... &amp;amp;nbsp; &amp;amp;nbsp;Código del empaquetado &lt;br /&gt;
&lt;br /&gt;
/test/com/.... &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; Paquete de la clase Mock&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
/test/componentes/com... Código de los test de componentes.&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Vamos a generar una tarea ant a la cual llamaremos &amp;quot;dist-mock&amp;quot; que tendrá por salida un war con un Dao que utiliza una interface Mock del Cliente del conector. Para esto necesitamos copiar no solo la clase mock, sino el archivo de Spring para inyectarle este mock al dao. Y luego limpiar la clase mock de nuestro src. Veamos el código ant en un build.xml:&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Tareas para generar un distribuible mock --&amp;gt;&lt;br /&gt;
    &amp;lt;target name=&amp;quot;dist-mock&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;echo&amp;gt;Dist Mock&amp;lt;/echo&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;esMock&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;claseMock&amp;quot;&lt;br /&gt;
            value=&amp;quot;./test/componente/com/.../ConnectorRemoteBusinessMock.java&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;directorioDestino&amp;quot;&lt;br /&gt;
            value=&amp;quot;./src/java/com/.../ejb&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;ejb-xml-mock&amp;quot;&lt;br /&gt;
            value=&amp;quot;./test/componente/spring-ejb-Componente.xml&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;ant target=&amp;quot;dist&amp;quot; inheritall=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;target name=&amp;quot;-pre-compile&amp;quot; if=&amp;quot;esMock&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;echo&amp;gt;Pre compile Mock&amp;lt;/echo&amp;gt;&lt;br /&gt;
        &amp;lt;copy file=&amp;quot;${claseMock}&amp;quot; todir=&amp;quot;${directorioDestino}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;target name=&amp;quot;-post-compile&amp;quot; if=&amp;quot;esMock&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;echo&amp;gt;Post compile Mock&amp;lt;/echo&amp;gt;&lt;br /&gt;
        &amp;lt;copy file=&amp;quot;${ejb-xml-mock}&amp;quot; todir=&amp;quot;${build.classes.dir}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;move file=&amp;quot;${build.classes.dir}/spring-ejb-Componente.xml&amp;quot;&lt;br /&gt;
            tofile=&amp;quot;${build.classes.dir}/spring-ejb.xml&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;target name=&amp;quot;-post-dist&amp;quot; if=&amp;quot;esMock&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;echo&amp;gt;Post dist Mock&amp;lt;/echo&amp;gt;&lt;br /&gt;
        &amp;lt;delete dir=&amp;quot;./src/java/com/tm&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Ahora expliquemos un poco cada parte del ant.&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
#Primero, ejecutando la tarea dist-mock estamos diciendo explicitamente que queremos un distribuible mock. Esto es recomendado, ya que de sobrescribir la tarea dist, podemos olvidarnos y migrar cosas dummy. En la tarea dist-mock se setea en true una variable &amp;quot;esMock&amp;quot;. Despues nos guardamos un par de propiedades por simplicidad del código, y llamamos a la tarea dist.&amp;amp;nbsp;&lt;br /&gt;
#En el pre-compile estamos ubicados antes de que ant compile las clases. Este es el momento en donde copiamos la clase mock a nuestro src.&lt;br /&gt;
#En el post-compile, las clases ya estan compiladas, y llevamos nuestro archivo de componentes de spring a donde quedaron las clases compiladas, y lo renombramos para pisar el archivo spring de src&lt;br /&gt;
#Luego, en el post-dist, antes de terminar, limpiamos el src y borramos la clase mock que copiamos&lt;br /&gt;
&lt;br /&gt;
Con esto tenemos un distribuible mock para hacer nuestras pruebas de &amp;quot;pseudo integración&amp;quot;, que pueden servirnos para avanzar con un desarrollo. Igual recuerden, que hasta no integrar nuestro código con los servicios reales, no deberíamos dar como terminado el mismo! Cuando antes fallemos en nuestro desarrollo, mas tiempo tendremos de resolver nuestros problemas.&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Prueba_De_Integracion_Dummy_con_Ant&amp;diff=6433</id>
		<title>Prueba De Integracion Dummy con Ant</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Prueba_De_Integracion_Dummy_con_Ant&amp;diff=6433"/>
				<updated>2011-11-15T20:47:45Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: Página creada con 'En diferentes oportunidades nos surge la necesidad de realizar pruebas de Integración contra servidores o servicios que no están disponibles por X motivo.   Este es un ejemplo…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En diferentes oportunidades nos surge la necesidad de realizar pruebas de Integración contra servidores o servicios que no están disponibles por X motivo. &lt;br /&gt;
&lt;br /&gt;
Este es un ejemplo de solución para un servicio que consume un Conector, el cuál le pega a una plataforma que no está disponible. Utilizando una clase Mock y un poco de ant, podemos generar un distribuible que nos sirva para probar el servicio de manera Mock. &lt;br /&gt;
&lt;br /&gt;
== Contexto  ==&lt;br /&gt;
&lt;br /&gt;
Supongamos que tenemos un servicio que estamos exponiendo, que internamente se comunica con un conector mediante una librería cliente. Lo hace mediante este Dao &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5=&amp;quot;java5&amp;quot;&amp;gt;&lt;br /&gt;
@Repository&lt;br /&gt;
public class ConectorDaoImpl implements ConectorDao {&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Conector delegate.&lt;br /&gt;
     */&lt;br /&gt;
    @Autowired&lt;br /&gt;
    private ConnectorRemoteBusiness conector;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * @{@inheritDoc}.&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    public void llamarAConector(String parametro)  {&lt;br /&gt;
        // código... &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Ahora supongamos que para nuestros test de componentes nos generemos una implementación mock del cliente del conector, para manejar datos dummy para nuestras pruebas: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5=&amp;quot;java5&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public class ConnectorRemoteBusinessMock implements ConnectorRemoteBusiness {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public String invocarConector(String parametro) throws RemoteException {&lt;br /&gt;
        String respuesta = null;&lt;br /&gt;
&lt;br /&gt;
        switch (parametro) {&lt;br /&gt;
            case 1: respuesta = &amp;quot;Respuesa1&amp;quot; break;&lt;br /&gt;
            case 2: respuesta = &amp;quot;Respuesa2&amp;quot; break;&lt;br /&gt;
            case 3: respuesta = &amp;quot;Respuesa3&amp;quot; break;&lt;br /&gt;
            default: respuesta = &amp;quot;default&amp;quot;; break;&lt;br /&gt;
        }&lt;br /&gt;
        return respuesta;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y en los test de componentes, configuramos Spring para que al Dao se le inyecte la implementación Mock. &lt;br /&gt;
&lt;br /&gt;
Ahora, supongamos que nuestro servidor sigue caído, y necesitamos generar un distribuible que utilice este Dao con la inyección del delegate mock. Podemos tunear las tareas ant para realizar dicha acción. Ahora vamos a ver como.&lt;br /&gt;
&lt;br /&gt;
== Generando el Distribuible Mock ==&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Prueba_De_Integracion&amp;diff=6432</id>
		<title>Prueba De Integracion</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Prueba_De_Integracion&amp;diff=6432"/>
				<updated>2011-11-15T20:09:18Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: Página creada con 'Estrategias de Testeo de aplicaciones a nivel Integración  * Prueba De Integracion Dummy con Ant'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Estrategias de Testeo de aplicaciones a nivel Integración&lt;br /&gt;
&lt;br /&gt;
* [[Prueba De Integracion Dummy con Ant]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5733</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5733"/>
				<updated>2011-04-26T18:54:48Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Ejemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]] con [[DSL]]. Para el ejemplo, suponemos una aplicación con seguridad, usuarios con diferentes Roles, y diferentes pantallas:&lt;br /&gt;
&lt;br /&gt;
=== AltaDenunciaSeleniumTest ===&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.fail;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class AltaDenunciaSeleniumTest {&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Test&lt;br /&gt;
    public void ingresarConRolAdministrativo_SeDaDeAltaUnaDenuncia() {&lt;br /&gt;
        Usuario.ingresarComoAdministrativo()&lt;br /&gt;
        .irAingresarDenuncia()&lt;br /&gt;
        .completarDenuncia()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarFinalizacionSinErrores()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta forma, escribimos el test de manera que al leer los métodos a los que se invoca, se entiende paso a paso lo que el test realiza, sin confundirnos con la implementación. Utilizando los patrones “method chaining” y “builder” la implementación de la clase Usuario sería una cosa así:&lt;br /&gt;
&lt;br /&gt;
=== Usuario ===&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.selenium.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.openqa.selenium.server.SeleniumServer;&lt;br /&gt;
&lt;br /&gt;
import com.thoughtworks.selenium.DefaultSelenium;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
import com.test.selenium.dsl.pagina.HomeAdministrativo;&lt;br /&gt;
&lt;br /&gt;
public class Usuario {&lt;br /&gt;
    &lt;br /&gt;
    public static final String TIEMPO_ESPERA = &amp;quot;90000&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_CERO = &amp;quot;0&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_TEST = &amp;quot;350&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    private static SeleniumServer seleniumServer;&lt;br /&gt;
    private static Selenium selenium ;&lt;br /&gt;
    &lt;br /&gt;
    public static void inicializar() throws Exception {&lt;br /&gt;
        seleniumServer = new SeleniumServer();&lt;br /&gt;
        seleniumServer.start();&lt;br /&gt;
        selenium = new DefaultSelenium( &amp;quot;localhost&amp;quot;, 4444, &amp;quot;*chrome&amp;quot;, &amp;quot;http://localhost:8585/&amp;quot;);&lt;br /&gt;
        selenium.start();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static HomeAdministrativo ingresarComoAdministrativo() {&lt;br /&gt;
        Usuario.login(&amp;quot;administrativo&amp;quot;);&lt;br /&gt;
        return new HomeAdministrativo(selenium);        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void finalizar() {&lt;br /&gt;
        selenium.stop();&lt;br /&gt;
        seleniumServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static void login(String username) {&lt;br /&gt;
        selenium.setSpeed(VELOCIDAD_TEST);&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        if (selenium.isElementPresent(&amp;quot;relogin&amp;quot;)) {&lt;br /&gt;
            selenium.click(&amp;quot;relogin&amp;quot;);&lt;br /&gt;
            selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        }&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.setSpeed(VELOCIDAD_CERO);&lt;br /&gt;
     &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos en el ejemplo, el método ingresarComoAdministrativo instancia y devuelve un objeto de la clase HomeAdministrativo cuya implementación es:&lt;br /&gt;
&lt;br /&gt;
=== HomeAdministrativo ===&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.selenium.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.assertEquals;&lt;br /&gt;
&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class HomeAdministrativo {&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
    &lt;br /&gt;
    public HomeAdministrativo(Selenium selenium) {&lt;br /&gt;
        this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public AltaDenuncia irAingresarDenuncia() {&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_TEST);&lt;br /&gt;
        selenium.getEval(&amp;quot;this.browserbot.getCurrentWindow().selectview('applications')&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        selenium.click(&amp;quot;link=IngresarDenuncia&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_CERO);&lt;br /&gt;
        return new AltaDenuncia(selenium);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    public void salir() {&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_TEST);&lt;br /&gt;
        selenium.getEval(&amp;quot;this.browserbot.getCurrentWindow().logoutMethod()&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        if (selenium.isElementPresent(&amp;quot;submit&amp;quot;)) {&lt;br /&gt;
            selenium.click(&amp;quot;submit&amp;quot;);&lt;br /&gt;
            selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        }&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_CERO);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public HomeAdministrativo verificarFinalizacionSinErrores() {&lt;br /&gt;
        assertEquals(&amp;quot;IngresarDenuncia&amp;quot;,      selenium.getText(&amp;quot;link=IngresarDenuncia&amp;quot;));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a utilizar el patrón builder y el método ingresar denuncia devuelve un objeto de la clase AltaDenuncia. De esta manera, cada clase representa a una pantalla de la aplicación, y expone cada funcionalidad que la misma ofrece. AltaDenuncia sería así:&lt;br /&gt;
&lt;br /&gt;
=== AltaDenuncia ===  &lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.selenium.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class AltaDenuncia {&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
    &lt;br /&gt;
    public AltaDenuncia(Selenium selenium) {&lt;br /&gt;
        this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public AltaDenuncia completarDenuncia() {&lt;br /&gt;
        &lt;br /&gt;
        // Acá iría el código Selenium para completar los campos&lt;br /&gt;
        &lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public HomeAdministrativo aceptar() {&lt;br /&gt;
        &lt;br /&gt;
        selenium.click(&amp;quot;OK&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        &lt;br /&gt;
        return new HomeAdministrativo(selenium);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public HomeAdministrativo cancelar() {&lt;br /&gt;
        selenium.click(&amp;quot;CANCELAR&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        &lt;br /&gt;
        return new HomeAdministrativo(selenium);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tanto el cancelar como el aceptar, devuelven la pantalla anterior. Todo se maneja con objetos que representan cada pantalla. &lt;br /&gt;
&lt;br /&gt;
== Conclusiones ==&lt;br /&gt;
&lt;br /&gt;
El resultado de hacer los test de esta manera, es la facilidad de escritura y mantenimiento del test en si mismo. A su vez, se podría diseñar las clases a utilizar en el DSL a conveniencia.&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5732</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5732"/>
				<updated>2011-04-26T18:52:36Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Ejemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]] con [[DSL]]. Para el ejemplo, suponemos una aplicación con seguridad, usuarios con diferentes Roles, y diferentes pantallas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.fail;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class AltaDenunciaSeleniumTest {&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Test&lt;br /&gt;
    public void ingresarConRolAdministrativo_SeDaDeAltaUnaDenuncia() {&lt;br /&gt;
        Usuario.ingresarComoAdministrativo()&lt;br /&gt;
        .irAingresarDenuncia()&lt;br /&gt;
        .completarDenuncia()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarFinalizacionSinErrores()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta forma, escribimos el test de manera que al leer los métodos a los que se invoca, se entiende paso a paso lo que el test realiza, sin confundirnos con la implementación. Utilizando los patrones “method chaining” y “builder” la implementación de la clase Usuario sería una cosa así:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.selenium.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.openqa.selenium.server.SeleniumServer;&lt;br /&gt;
&lt;br /&gt;
import com.thoughtworks.selenium.DefaultSelenium;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
import com.test.selenium.dsl.pagina.HomeAdministrativo;&lt;br /&gt;
&lt;br /&gt;
public class Usuario {&lt;br /&gt;
    &lt;br /&gt;
    public static final String TIEMPO_ESPERA = &amp;quot;90000&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_CERO = &amp;quot;0&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_TEST = &amp;quot;350&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    private static SeleniumServer seleniumServer;&lt;br /&gt;
    private static Selenium selenium ;&lt;br /&gt;
    &lt;br /&gt;
    public static void inicializar() throws Exception {&lt;br /&gt;
        seleniumServer = new SeleniumServer();&lt;br /&gt;
        seleniumServer.start();&lt;br /&gt;
        selenium = new DefaultSelenium( &amp;quot;localhost&amp;quot;, 4444, &amp;quot;*chrome&amp;quot;, &amp;quot;http://localhost:8585/&amp;quot;);&lt;br /&gt;
        selenium.start();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static HomeAdministrativo ingresarComoAdministrativo() {&lt;br /&gt;
        Usuario.login(&amp;quot;administrativo&amp;quot;);&lt;br /&gt;
        return new HomeAdministrativo(selenium);        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void finalizar() {&lt;br /&gt;
        selenium.stop();&lt;br /&gt;
        seleniumServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static void login(String username) {&lt;br /&gt;
        selenium.setSpeed(VELOCIDAD_TEST);&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        if (selenium.isElementPresent(&amp;quot;relogin&amp;quot;)) {&lt;br /&gt;
            selenium.click(&amp;quot;relogin&amp;quot;);&lt;br /&gt;
            selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        }&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.setSpeed(VELOCIDAD_CERO);&lt;br /&gt;
     &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos en el ejemplo, el método ingresarComoAdministrativo instancia y devuelve un objeto de la clase HomeAdministrativo cuya implementación es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.selenium.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.assertEquals;&lt;br /&gt;
&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class HomeAdministrativo {&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
    &lt;br /&gt;
    public HomeAdministrativo(Selenium selenium) {&lt;br /&gt;
        this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public AltaDenuncia irAingresarDenuncia() {&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_TEST);&lt;br /&gt;
        selenium.getEval(&amp;quot;this.browserbot.getCurrentWindow().selectview('applications')&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        selenium.click(&amp;quot;link=IngresarDenuncia&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_CERO);&lt;br /&gt;
        return new AltaDenuncia(selenium);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    public void salir() {&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_TEST);&lt;br /&gt;
        selenium.getEval(&amp;quot;this.browserbot.getCurrentWindow().logoutMethod()&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        if (selenium.isElementPresent(&amp;quot;submit&amp;quot;)) {&lt;br /&gt;
            selenium.click(&amp;quot;submit&amp;quot;);&lt;br /&gt;
            selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        }&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_CERO);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public HomeAdministrativo verificarFinalizacionSinErrores() {&lt;br /&gt;
        assertEquals(&amp;quot;IngresarDenuncia&amp;quot;,      selenium.getText(&amp;quot;link=IngresarDenuncia&amp;quot;));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volvemos a utilizar el patrón builder y el método ingresar denuncia devuelve un objeto de la clase AltaDenuncia. De esta manera, cada clase representa a una pantalla de la aplicación, y expone cada funcionalidad que la misma ofrece. AltaDenuncia sería así:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.selenium.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class AltaDenuncia {&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
    &lt;br /&gt;
    public AltaDenuncia(Selenium selenium) {&lt;br /&gt;
        this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public AltaDenuncia completarDenuncia() {&lt;br /&gt;
        &lt;br /&gt;
        // Acá iría el código Selenium para completar los campos&lt;br /&gt;
        &lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public HomeAdministrativo aceptar() {&lt;br /&gt;
        &lt;br /&gt;
        selenium.click(&amp;quot;OK&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        &lt;br /&gt;
        return new HomeAdministrativo(selenium);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public HomeAdministrativo cancelar() {&lt;br /&gt;
        selenium.click(&amp;quot;CANCELAR&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        &lt;br /&gt;
        return new HomeAdministrativo(selenium);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5731</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5731"/>
				<updated>2011-04-26T18:49:43Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Ejemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]] con [[DSL]]. Para el ejemplo, suponemos una aplicación con seguridad, usuarios con diferentes Roles, y diferentes pantallas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.fail;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class AltaDenunciaSeleniumTest {&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Test&lt;br /&gt;
    public void ingresarConRolAdministrativo_SeDaDeAltaUnaDenuncia() {&lt;br /&gt;
        Usuario.ingresarComoAdministrativo()&lt;br /&gt;
        .irAingresarDenuncia()&lt;br /&gt;
        .completarDenuncia()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarFinalizacionSinErrores()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta forma, escribimos el test de manera que al leer los métodos a los que se invoca, se entiende paso a paso lo que el test realiza, sin confundirnos con la implementación. Utilizando los patrones “method chaining” y “builder” la implementación de la clase Usuario sería una cosa así:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.selenium.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.openqa.selenium.server.SeleniumServer;&lt;br /&gt;
&lt;br /&gt;
import com.thoughtworks.selenium.DefaultSelenium;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
import com.test.selenium.dsl.pagina.HomeAdministrativo;&lt;br /&gt;
&lt;br /&gt;
public class Usuario {&lt;br /&gt;
    &lt;br /&gt;
    public static final String TIEMPO_ESPERA = &amp;quot;90000&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_CERO = &amp;quot;0&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_TEST = &amp;quot;350&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    private static SeleniumServer seleniumServer;&lt;br /&gt;
    private static Selenium selenium ;&lt;br /&gt;
    &lt;br /&gt;
    public static void inicializar() throws Exception {&lt;br /&gt;
        seleniumServer = new SeleniumServer();&lt;br /&gt;
        seleniumServer.start();&lt;br /&gt;
        selenium = new DefaultSelenium( &amp;quot;localhost&amp;quot;, 4444, &amp;quot;*chrome&amp;quot;, &amp;quot;http://localhost:8585/&amp;quot;);&lt;br /&gt;
        selenium.start();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static HomeAdministrativo ingresarComoAdministrativo() {&lt;br /&gt;
        Usuario.login(&amp;quot;administrativo&amp;quot;);&lt;br /&gt;
        return new HomeAdministrativo(selenium);        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void finalizar() {&lt;br /&gt;
        selenium.stop();&lt;br /&gt;
        seleniumServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static void login(String username) {&lt;br /&gt;
        selenium.setSpeed(VELOCIDAD_TEST);&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        if (selenium.isElementPresent(&amp;quot;relogin&amp;quot;)) {&lt;br /&gt;
            selenium.click(&amp;quot;relogin&amp;quot;);&lt;br /&gt;
            selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        }&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.setSpeed(VELOCIDAD_CERO);&lt;br /&gt;
     &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como vemos en el ejemplo, el método ingresarComoAdministrativo instancia y devuelve un objeto de la clase HomeAdministrativo cuya implementación es:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.selenium.dsl.pagina;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.assertEquals;&lt;br /&gt;
&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class HomeAdministrativo {&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    private Selenium selenium;&lt;br /&gt;
    &lt;br /&gt;
    public HomeAdministrativo(Selenium selenium) {&lt;br /&gt;
        this.selenium = selenium;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public AltaDenuncia irAingresarDenuncia() {&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_TEST);&lt;br /&gt;
        selenium.getEval(&amp;quot;this.browserbot.getCurrentWindow().selectview('applications')&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        selenium.click(&amp;quot;link=IngresarDenuncia&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_CERO);&lt;br /&gt;
        return new AltaDenuncia(selenium);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    public void salir() {&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_TEST);&lt;br /&gt;
        selenium.getEval(&amp;quot;this.browserbot.getCurrentWindow().logoutMethod()&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        if (selenium.isElementPresent(&amp;quot;submit&amp;quot;)) {&lt;br /&gt;
            selenium.click(&amp;quot;submit&amp;quot;);&lt;br /&gt;
            selenium.waitForPageToLoad(Usuario.TIEMPO_ESPERA);&lt;br /&gt;
        }&lt;br /&gt;
        selenium.setSpeed(Usuario.VELOCIDAD_CERO);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public HomeAdministrativo verificarFinalizacionSinErrores() {&lt;br /&gt;
        assertEquals(&amp;quot;IngresarDenuncia&amp;quot;,      selenium.getText(&amp;quot;link=IngresarDenuncia&amp;quot;));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5730</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5730"/>
				<updated>2011-04-26T18:47:47Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Ejemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]] con [[DSL]]. Para el ejemplo, suponemos una aplicación con seguridad, usuarios con diferentes Roles, y diferentes pantallas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.fail;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class AltaDenunciaSeleniumTest {&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Test&lt;br /&gt;
    public void ingresarConRolAdministrativo_SeDaDeAltaUnaDenuncia() {&lt;br /&gt;
        Usuario.ingresarComoAdministrativo()&lt;br /&gt;
        .irAingresarDenuncia()&lt;br /&gt;
        .completarDenuncia()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarFinalizacionSinErrores()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta forma, escribimos el test de manera que al leer los métodos a los que se invoca, se entiende paso a paso lo que el test realiza, sin confundirnos con la implementación. Utilizando los patrones “method chaining” y “builder” la implementación sería una cosa así:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test.selenium.dsl;&lt;br /&gt;
&lt;br /&gt;
import org.openqa.selenium.server.SeleniumServer;&lt;br /&gt;
&lt;br /&gt;
import com.thoughtworks.selenium.DefaultSelenium;&lt;br /&gt;
import com.thoughtworks.selenium.Selenium;&lt;br /&gt;
import com.test.selenium.dsl.pagina.HomeAdministrativo;&lt;br /&gt;
&lt;br /&gt;
public class Usuario {&lt;br /&gt;
    &lt;br /&gt;
    public static final String TIEMPO_ESPERA = &amp;quot;90000&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_CERO = &amp;quot;0&amp;quot;;&lt;br /&gt;
    public static final String VELOCIDAD_TEST = &amp;quot;350&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    private static SeleniumServer seleniumServer;&lt;br /&gt;
    private static Selenium selenium ;&lt;br /&gt;
    &lt;br /&gt;
    public static void inicializar() throws Exception {&lt;br /&gt;
        seleniumServer = new SeleniumServer();&lt;br /&gt;
        seleniumServer.start();&lt;br /&gt;
        selenium = new DefaultSelenium( &amp;quot;localhost&amp;quot;, 4444, &amp;quot;*chrome&amp;quot;, &amp;quot;http://localhost:8585/&amp;quot;);&lt;br /&gt;
        selenium.start();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static HomeAdministrativo ingresarComoAdministrativo() {&lt;br /&gt;
        Usuario.login(&amp;quot;administrativo&amp;quot;);&lt;br /&gt;
        return new HomeAdministrativo(selenium);        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void finalizar() {&lt;br /&gt;
        selenium.stop();&lt;br /&gt;
        seleniumServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static void login(String username) {&lt;br /&gt;
        selenium.setSpeed(VELOCIDAD_TEST);&lt;br /&gt;
        selenium.open(&amp;quot;&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        if (selenium.isElementPresent(&amp;quot;relogin&amp;quot;)) {&lt;br /&gt;
            selenium.click(&amp;quot;relogin&amp;quot;);&lt;br /&gt;
            selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        }&lt;br /&gt;
        selenium.type(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
        selenium.click(&amp;quot;submitbutton&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(TIEMPO_ESPERA);&lt;br /&gt;
        selenium.setSpeed(VELOCIDAD_CERO);&lt;br /&gt;
     &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5729</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5729"/>
				<updated>2011-04-26T18:45:23Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]] con [[DSL]]. Para el ejemplo, suponemos una aplicación con seguridad, usuarios con diferentes Roles, y diferentes pantallas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.fail;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class AltaDenunciaSeleniumTest {&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Test&lt;br /&gt;
    public void ingresarConRolAdministrativo_SeDaDeAltaUnaDenuncia() {&lt;br /&gt;
        Usuario.ingresarComoAdministrativo()&lt;br /&gt;
        .irAingresarDenuncia()&lt;br /&gt;
        .completarDenuncia()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarFinalizacionSinErrores()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De esta forma, escribimos el test de manera que al leer los métodos a los que se invoca, se entiende paso a paso lo que el test realiza, sin confundirnos con la implementación. Utilizando los patrones “method chaining” y “builder” la implementación sería una cosa así:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5728</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5728"/>
				<updated>2011-04-26T18:41:04Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Ejemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]] con [[DSL]]. Para el ejemplo, suponemos una aplicación con seguridad, usuarios con diferentes Roles, y diferentes pantallas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.fail;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class AltaDenunciaSeleniumTest {&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Test&lt;br /&gt;
    public void ingresarConRolAdministrativo_SeDaDeAltaUnaDenuncia() {&lt;br /&gt;
        Usuario.ingresarComoAdministrativo()&lt;br /&gt;
        .irAingresarDenuncia()&lt;br /&gt;
        .completarDenuncia()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarFinalizacionSinErrores()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5727</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5727"/>
				<updated>2011-04-26T18:40:35Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Ejemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]] con [[DSL]]. Para el ejemplo, suponemos una aplicación con seguridad, usuarios con diferentes Roles, y diferentes pantallas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
package com.test;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.fail;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
import com.test.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class AltaDenunciaSeleniumTest {&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Test&lt;br /&gt;
    public void ingresarConRolAdministrativo_SeDaDeAltaUnaDenuncia() {&lt;br /&gt;
        Usuario.ingresarComoAdministrativo()&lt;br /&gt;
        .irAingresarDenuncia()&lt;br /&gt;
        .completarDenuncia()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarFinalizacionSinErrores()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code java&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5726</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5726"/>
				<updated>2011-04-26T18:39:39Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&lt;br /&gt;
A continuación mostramos una propuesta de como encarar un test de [[Selenium]] con [[DSL]]. Para el ejemplo, suponemos una aplicación con seguridad, usuarios con diferentes Roles, y diferentes pantallas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * To change this template, choose Tools | Templates&lt;br /&gt;
 * and open the template in the editor.&lt;br /&gt;
 */&lt;br /&gt;
package com.tm.denuncias.selenium;&lt;br /&gt;
&lt;br /&gt;
import static org.junit.Assert.fail;&lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileWriter;&lt;br /&gt;
&lt;br /&gt;
import org.junit.AfterClass;&lt;br /&gt;
import org.junit.Before;&lt;br /&gt;
import org.junit.BeforeClass;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
import com.tm.denuncias.selenium.base.BaseIntegracionSeleniumTest;&lt;br /&gt;
import com.tm.denuncias.selenium.dsl.Usuario;&lt;br /&gt;
&lt;br /&gt;
public class AltaDenunciaSeleniumTest {&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    @BeforeClass&lt;br /&gt;
    public static void setUpClass() throws Exception {&lt;br /&gt;
        Usuario.inicializar();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @AfterClass&lt;br /&gt;
    public static void tearDownClass() throws Exception {&lt;br /&gt;
        Usuario.finalizar();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Test&lt;br /&gt;
    public void ingresarConRolAdministrativo_SeDaDeAltaUnaDenuncia() {&lt;br /&gt;
        Usuario.ingresarComoAdministrativo()&lt;br /&gt;
        .irAingresarDenuncia()&lt;br /&gt;
        .completarDenuncia()&lt;br /&gt;
        .aceptar()&lt;br /&gt;
        .verificarFinalizacionSinErrores()&lt;br /&gt;
        .salir();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code java&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5725</id>
		<title>Selenium con DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium_con_DSL&amp;diff=5725"/>
				<updated>2011-04-26T18:26:25Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: Página creada con 'Selenium es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas fun…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta para pruebas de aplicaciones web. Quién tuvo la posibilidad de utilizarla, sabrá lo poderosa que es la herramienta, la cuál tiene diversas funciones para ejecutar con nuestra aplicación web. &lt;br /&gt;
Puede ocurrir, que nuestros test de [[Selenium]] se vayan complejizando a medida que nuestra aplicación crece, por lo que esta es una posible solución, combinando el poder de [[Selenium]] con un enfoque [[DSL]].&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5724</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5724"/>
				<updated>2011-04-26T18:23:51Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuente: [http://eamodeorubio.wordpress.com/2010/09/13/%C2%BFque-son-los-dsl-domain-specific-languages/ Que son los Dsl]''&lt;br /&gt;
&lt;br /&gt;
== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo:&lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL:&lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
Existe un ciclo de vida en la evolución de una solución a un problema dentro del software. Primero resolvemos el problema como se nos ocurra. Después, conforme ganamos experiencia, al resolver el problema varias veces en contextos distintos, encontramos buenas prácticas o “recetas”, que nos permiten resolver el problema mediante copy/paste. En una etapa posterior de maduración, conseguimos abstraer esas recetas, en una librería que sigue un determinado diseño, y obtenemos un patrón de diseño al abstraer el diseño de la implementación en si. Una vez que tenemos varios patrones de diseño que resuelven distintos problemas de la misma categoría, podemos implementarlos juntos, y obtenemos un framework. Finalmente, y este es el paso menos conocido, el framework se hace cada vez más configurable y automatizado, con lo que éste termina evolucionando en un DSL. &lt;br /&gt;
&lt;br /&gt;
== Tipos de DSL ==&lt;br /&gt;
Desde el punto de vista del tipo de problemas que resuelven, tenemos dos tipos de DSL, DSLs de negocio y DSLs técnicos. Sin embargo existe otra forma diferente de categorizar los DSLs, según el enfoque a la hora de implementarlos. De esta manera tenemos dos tipos:&lt;br /&gt;
&lt;br /&gt;
=== DSLs externos === &lt;br /&gt;
Un DSL externo es un lenguaje en si mismo, independiente de cualquier otro lenguaje. Posee su propia sintaxis, compilador y/o interprete, e incluso puede llegar a tener su propio IDE. Ejemplos de DSLs externos son SQL o ANTLR. &lt;br /&gt;
Los DSLs externos son el típico caso en el que uno piensa cuando se imagina un DSL, un lenguaje nuevo y aparte de los que ya existen.&lt;br /&gt;
&lt;br /&gt;
=== DSLs internos === &lt;br /&gt;
En este enfoque no construimos un lenguaje desde cero, sino que aprovechamos un lenguaje ya existente para construir nuestro DSL. Usando un poco de imaginación y exprimiendo los trucos del lenguaje anfitrión y su sintaxis, podemos construir una librería o framework que implemente el DSL de forma nativa al lenguaje anfitrión. Algunas técnicas usadas son los patrones “method chaining” y “builder”, el uso de métodos factoría estáticos, import estáticos, tipos y métodos paramétricos (genéricos) y por supuesto mucha reflexión, metaprogramación y los siempre agradecidos proxies dinámicos. &lt;br /&gt;
Un excelente ejemplo de DSL interno es el propio jMock. &lt;br /&gt;
Los DSL internos también son llamados &amp;quot;fluent interface&amp;quot; o &amp;quot;fluent API&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Enlaces ==&lt;br /&gt;
[http://eamodeorubio.wordpress.com/2010/09/13/%C2%BFque-son-los-dsl-domain-specific-languages/ Fuente]&lt;br /&gt;
&lt;br /&gt;
[[Selenium con DSL]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5723</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5723"/>
				<updated>2011-04-26T18:23:32Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Fuente: [http://eamodeorubio.wordpress.com/2010/09/13/%C2%BFque-son-los-dsl-domain-specific-languages/]''&lt;br /&gt;
&lt;br /&gt;
== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo:&lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL:&lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
Existe un ciclo de vida en la evolución de una solución a un problema dentro del software. Primero resolvemos el problema como se nos ocurra. Después, conforme ganamos experiencia, al resolver el problema varias veces en contextos distintos, encontramos buenas prácticas o “recetas”, que nos permiten resolver el problema mediante copy/paste. En una etapa posterior de maduración, conseguimos abstraer esas recetas, en una librería que sigue un determinado diseño, y obtenemos un patrón de diseño al abstraer el diseño de la implementación en si. Una vez que tenemos varios patrones de diseño que resuelven distintos problemas de la misma categoría, podemos implementarlos juntos, y obtenemos un framework. Finalmente, y este es el paso menos conocido, el framework se hace cada vez más configurable y automatizado, con lo que éste termina evolucionando en un DSL. &lt;br /&gt;
&lt;br /&gt;
== Tipos de DSL ==&lt;br /&gt;
Desde el punto de vista del tipo de problemas que resuelven, tenemos dos tipos de DSL, DSLs de negocio y DSLs técnicos. Sin embargo existe otra forma diferente de categorizar los DSLs, según el enfoque a la hora de implementarlos. De esta manera tenemos dos tipos:&lt;br /&gt;
&lt;br /&gt;
=== DSLs externos === &lt;br /&gt;
Un DSL externo es un lenguaje en si mismo, independiente de cualquier otro lenguaje. Posee su propia sintaxis, compilador y/o interprete, e incluso puede llegar a tener su propio IDE. Ejemplos de DSLs externos son SQL o ANTLR. &lt;br /&gt;
Los DSLs externos son el típico caso en el que uno piensa cuando se imagina un DSL, un lenguaje nuevo y aparte de los que ya existen.&lt;br /&gt;
&lt;br /&gt;
=== DSLs internos === &lt;br /&gt;
En este enfoque no construimos un lenguaje desde cero, sino que aprovechamos un lenguaje ya existente para construir nuestro DSL. Usando un poco de imaginación y exprimiendo los trucos del lenguaje anfitrión y su sintaxis, podemos construir una librería o framework que implemente el DSL de forma nativa al lenguaje anfitrión. Algunas técnicas usadas son los patrones “method chaining” y “builder”, el uso de métodos factoría estáticos, import estáticos, tipos y métodos paramétricos (genéricos) y por supuesto mucha reflexión, metaprogramación y los siempre agradecidos proxies dinámicos. &lt;br /&gt;
Un excelente ejemplo de DSL interno es el propio jMock. &lt;br /&gt;
Los DSL internos también son llamados &amp;quot;fluent interface&amp;quot; o &amp;quot;fluent API&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Enlaces ==&lt;br /&gt;
[http://eamodeorubio.wordpress.com/2010/09/13/%C2%BFque-son-los-dsl-domain-specific-languages/ Fuente]&lt;br /&gt;
&lt;br /&gt;
[[Selenium con DSL]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5722</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5722"/>
				<updated>2011-04-26T18:22:54Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Enlaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo:&lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL:&lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
Existe un ciclo de vida en la evolución de una solución a un problema dentro del software. Primero resolvemos el problema como se nos ocurra. Después, conforme ganamos experiencia, al resolver el problema varias veces en contextos distintos, encontramos buenas prácticas o “recetas”, que nos permiten resolver el problema mediante copy/paste. En una etapa posterior de maduración, conseguimos abstraer esas recetas, en una librería que sigue un determinado diseño, y obtenemos un patrón de diseño al abstraer el diseño de la implementación en si. Una vez que tenemos varios patrones de diseño que resuelven distintos problemas de la misma categoría, podemos implementarlos juntos, y obtenemos un framework. Finalmente, y este es el paso menos conocido, el framework se hace cada vez más configurable y automatizado, con lo que éste termina evolucionando en un DSL. &lt;br /&gt;
&lt;br /&gt;
== Tipos de DSL ==&lt;br /&gt;
Desde el punto de vista del tipo de problemas que resuelven, tenemos dos tipos de DSL, DSLs de negocio y DSLs técnicos. Sin embargo existe otra forma diferente de categorizar los DSLs, según el enfoque a la hora de implementarlos. De esta manera tenemos dos tipos:&lt;br /&gt;
&lt;br /&gt;
=== DSLs externos === &lt;br /&gt;
Un DSL externo es un lenguaje en si mismo, independiente de cualquier otro lenguaje. Posee su propia sintaxis, compilador y/o interprete, e incluso puede llegar a tener su propio IDE. Ejemplos de DSLs externos son SQL o ANTLR. &lt;br /&gt;
Los DSLs externos son el típico caso en el que uno piensa cuando se imagina un DSL, un lenguaje nuevo y aparte de los que ya existen.&lt;br /&gt;
&lt;br /&gt;
=== DSLs internos === &lt;br /&gt;
En este enfoque no construimos un lenguaje desde cero, sino que aprovechamos un lenguaje ya existente para construir nuestro DSL. Usando un poco de imaginación y exprimiendo los trucos del lenguaje anfitrión y su sintaxis, podemos construir una librería o framework que implemente el DSL de forma nativa al lenguaje anfitrión. Algunas técnicas usadas son los patrones “method chaining” y “builder”, el uso de métodos factoría estáticos, import estáticos, tipos y métodos paramétricos (genéricos) y por supuesto mucha reflexión, metaprogramación y los siempre agradecidos proxies dinámicos. &lt;br /&gt;
Un excelente ejemplo de DSL interno es el propio jMock. &lt;br /&gt;
Los DSL internos también son llamados &amp;quot;fluent interface&amp;quot; o &amp;quot;fluent API&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Enlaces ==&lt;br /&gt;
[http://eamodeorubio.wordpress.com/2010/09/13/%C2%BFque-son-los-dsl-domain-specific-languages/ Fuente]&lt;br /&gt;
&lt;br /&gt;
[[Selenium con DSL]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5721</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5721"/>
				<updated>2011-04-26T18:22:40Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Enlaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo:&lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL:&lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
Existe un ciclo de vida en la evolución de una solución a un problema dentro del software. Primero resolvemos el problema como se nos ocurra. Después, conforme ganamos experiencia, al resolver el problema varias veces en contextos distintos, encontramos buenas prácticas o “recetas”, que nos permiten resolver el problema mediante copy/paste. En una etapa posterior de maduración, conseguimos abstraer esas recetas, en una librería que sigue un determinado diseño, y obtenemos un patrón de diseño al abstraer el diseño de la implementación en si. Una vez que tenemos varios patrones de diseño que resuelven distintos problemas de la misma categoría, podemos implementarlos juntos, y obtenemos un framework. Finalmente, y este es el paso menos conocido, el framework se hace cada vez más configurable y automatizado, con lo que éste termina evolucionando en un DSL. &lt;br /&gt;
&lt;br /&gt;
== Tipos de DSL ==&lt;br /&gt;
Desde el punto de vista del tipo de problemas que resuelven, tenemos dos tipos de DSL, DSLs de negocio y DSLs técnicos. Sin embargo existe otra forma diferente de categorizar los DSLs, según el enfoque a la hora de implementarlos. De esta manera tenemos dos tipos:&lt;br /&gt;
&lt;br /&gt;
=== DSLs externos === &lt;br /&gt;
Un DSL externo es un lenguaje en si mismo, independiente de cualquier otro lenguaje. Posee su propia sintaxis, compilador y/o interprete, e incluso puede llegar a tener su propio IDE. Ejemplos de DSLs externos son SQL o ANTLR. &lt;br /&gt;
Los DSLs externos son el típico caso en el que uno piensa cuando se imagina un DSL, un lenguaje nuevo y aparte de los que ya existen.&lt;br /&gt;
&lt;br /&gt;
=== DSLs internos === &lt;br /&gt;
En este enfoque no construimos un lenguaje desde cero, sino que aprovechamos un lenguaje ya existente para construir nuestro DSL. Usando un poco de imaginación y exprimiendo los trucos del lenguaje anfitrión y su sintaxis, podemos construir una librería o framework que implemente el DSL de forma nativa al lenguaje anfitrión. Algunas técnicas usadas son los patrones “method chaining” y “builder”, el uso de métodos factoría estáticos, import estáticos, tipos y métodos paramétricos (genéricos) y por supuesto mucha reflexión, metaprogramación y los siempre agradecidos proxies dinámicos. &lt;br /&gt;
Un excelente ejemplo de DSL interno es el propio jMock. &lt;br /&gt;
Los DSL internos también son llamados &amp;quot;fluent interface&amp;quot; o &amp;quot;fluent API&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Enlaces ==&lt;br /&gt;
[http://eamodeorubio.wordpress.com/2010/09/13/%C2%BFque-son-los-dsl-domain-specific-languages/ Fuente]&lt;br /&gt;
[[Selenium con DSL]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5720</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5720"/>
				<updated>2011-04-26T18:22:29Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Enlaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo:&lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL:&lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
Existe un ciclo de vida en la evolución de una solución a un problema dentro del software. Primero resolvemos el problema como se nos ocurra. Después, conforme ganamos experiencia, al resolver el problema varias veces en contextos distintos, encontramos buenas prácticas o “recetas”, que nos permiten resolver el problema mediante copy/paste. En una etapa posterior de maduración, conseguimos abstraer esas recetas, en una librería que sigue un determinado diseño, y obtenemos un patrón de diseño al abstraer el diseño de la implementación en si. Una vez que tenemos varios patrones de diseño que resuelven distintos problemas de la misma categoría, podemos implementarlos juntos, y obtenemos un framework. Finalmente, y este es el paso menos conocido, el framework se hace cada vez más configurable y automatizado, con lo que éste termina evolucionando en un DSL. &lt;br /&gt;
&lt;br /&gt;
== Tipos de DSL ==&lt;br /&gt;
Desde el punto de vista del tipo de problemas que resuelven, tenemos dos tipos de DSL, DSLs de negocio y DSLs técnicos. Sin embargo existe otra forma diferente de categorizar los DSLs, según el enfoque a la hora de implementarlos. De esta manera tenemos dos tipos:&lt;br /&gt;
&lt;br /&gt;
=== DSLs externos === &lt;br /&gt;
Un DSL externo es un lenguaje en si mismo, independiente de cualquier otro lenguaje. Posee su propia sintaxis, compilador y/o interprete, e incluso puede llegar a tener su propio IDE. Ejemplos de DSLs externos son SQL o ANTLR. &lt;br /&gt;
Los DSLs externos son el típico caso en el que uno piensa cuando se imagina un DSL, un lenguaje nuevo y aparte de los que ya existen.&lt;br /&gt;
&lt;br /&gt;
=== DSLs internos === &lt;br /&gt;
En este enfoque no construimos un lenguaje desde cero, sino que aprovechamos un lenguaje ya existente para construir nuestro DSL. Usando un poco de imaginación y exprimiendo los trucos del lenguaje anfitrión y su sintaxis, podemos construir una librería o framework que implemente el DSL de forma nativa al lenguaje anfitrión. Algunas técnicas usadas son los patrones “method chaining” y “builder”, el uso de métodos factoría estáticos, import estáticos, tipos y métodos paramétricos (genéricos) y por supuesto mucha reflexión, metaprogramación y los siempre agradecidos proxies dinámicos. &lt;br /&gt;
Un excelente ejemplo de DSL interno es el propio jMock. &lt;br /&gt;
Los DSL internos también son llamados &amp;quot;fluent interface&amp;quot; o &amp;quot;fluent API&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Enlaces ==&lt;br /&gt;
[http://eamodeorubio.wordpress.com/2010/09/13/%C2%BFque-son-los-dsl-domain-specific-languages/ Fuente]&lt;br /&gt;
&lt;br /&gt;
[[Selenium con DSL]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5719</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5719"/>
				<updated>2011-04-26T18:22:13Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Enlaces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo:&lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL:&lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
Existe un ciclo de vida en la evolución de una solución a un problema dentro del software. Primero resolvemos el problema como se nos ocurra. Después, conforme ganamos experiencia, al resolver el problema varias veces en contextos distintos, encontramos buenas prácticas o “recetas”, que nos permiten resolver el problema mediante copy/paste. En una etapa posterior de maduración, conseguimos abstraer esas recetas, en una librería que sigue un determinado diseño, y obtenemos un patrón de diseño al abstraer el diseño de la implementación en si. Una vez que tenemos varios patrones de diseño que resuelven distintos problemas de la misma categoría, podemos implementarlos juntos, y obtenemos un framework. Finalmente, y este es el paso menos conocido, el framework se hace cada vez más configurable y automatizado, con lo que éste termina evolucionando en un DSL. &lt;br /&gt;
&lt;br /&gt;
== Tipos de DSL ==&lt;br /&gt;
Desde el punto de vista del tipo de problemas que resuelven, tenemos dos tipos de DSL, DSLs de negocio y DSLs técnicos. Sin embargo existe otra forma diferente de categorizar los DSLs, según el enfoque a la hora de implementarlos. De esta manera tenemos dos tipos:&lt;br /&gt;
&lt;br /&gt;
=== DSLs externos === &lt;br /&gt;
Un DSL externo es un lenguaje en si mismo, independiente de cualquier otro lenguaje. Posee su propia sintaxis, compilador y/o interprete, e incluso puede llegar a tener su propio IDE. Ejemplos de DSLs externos son SQL o ANTLR. &lt;br /&gt;
Los DSLs externos son el típico caso en el que uno piensa cuando se imagina un DSL, un lenguaje nuevo y aparte de los que ya existen.&lt;br /&gt;
&lt;br /&gt;
=== DSLs internos === &lt;br /&gt;
En este enfoque no construimos un lenguaje desde cero, sino que aprovechamos un lenguaje ya existente para construir nuestro DSL. Usando un poco de imaginación y exprimiendo los trucos del lenguaje anfitrión y su sintaxis, podemos construir una librería o framework que implemente el DSL de forma nativa al lenguaje anfitrión. Algunas técnicas usadas son los patrones “method chaining” y “builder”, el uso de métodos factoría estáticos, import estáticos, tipos y métodos paramétricos (genéricos) y por supuesto mucha reflexión, metaprogramación y los siempre agradecidos proxies dinámicos. &lt;br /&gt;
Un excelente ejemplo de DSL interno es el propio jMock. &lt;br /&gt;
Los DSL internos también son llamados &amp;quot;fluent interface&amp;quot; o &amp;quot;fluent API&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Enlaces ==&lt;br /&gt;
[http://eamodeorubio.wordpress.com/2010/09/13/%C2%BFque-son-los-dsl-domain-specific-languages/ Fuente]&lt;br /&gt;
[Selenium con DSL]&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5718</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5718"/>
				<updated>2011-04-26T18:18:54Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo:&lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL:&lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
Existe un ciclo de vida en la evolución de una solución a un problema dentro del software. Primero resolvemos el problema como se nos ocurra. Después, conforme ganamos experiencia, al resolver el problema varias veces en contextos distintos, encontramos buenas prácticas o “recetas”, que nos permiten resolver el problema mediante copy/paste. En una etapa posterior de maduración, conseguimos abstraer esas recetas, en una librería que sigue un determinado diseño, y obtenemos un patrón de diseño al abstraer el diseño de la implementación en si. Una vez que tenemos varios patrones de diseño que resuelven distintos problemas de la misma categoría, podemos implementarlos juntos, y obtenemos un framework. Finalmente, y este es el paso menos conocido, el framework se hace cada vez más configurable y automatizado, con lo que éste termina evolucionando en un DSL. &lt;br /&gt;
&lt;br /&gt;
== Tipos de DSL ==&lt;br /&gt;
Desde el punto de vista del tipo de problemas que resuelven, tenemos dos tipos de DSL, DSLs de negocio y DSLs técnicos. Sin embargo existe otra forma diferente de categorizar los DSLs, según el enfoque a la hora de implementarlos. De esta manera tenemos dos tipos:&lt;br /&gt;
&lt;br /&gt;
=== DSLs externos === &lt;br /&gt;
Un DSL externo es un lenguaje en si mismo, independiente de cualquier otro lenguaje. Posee su propia sintaxis, compilador y/o interprete, e incluso puede llegar a tener su propio IDE. Ejemplos de DSLs externos son SQL o ANTLR. &lt;br /&gt;
Los DSLs externos son el típico caso en el que uno piensa cuando se imagina un DSL, un lenguaje nuevo y aparte de los que ya existen.&lt;br /&gt;
&lt;br /&gt;
=== DSLs internos === &lt;br /&gt;
En este enfoque no construimos un lenguaje desde cero, sino que aprovechamos un lenguaje ya existente para construir nuestro DSL. Usando un poco de imaginación y exprimiendo los trucos del lenguaje anfitrión y su sintaxis, podemos construir una librería o framework que implemente el DSL de forma nativa al lenguaje anfitrión. Algunas técnicas usadas son los patrones “method chaining” y “builder”, el uso de métodos factoría estáticos, import estáticos, tipos y métodos paramétricos (genéricos) y por supuesto mucha reflexión, metaprogramación y los siempre agradecidos proxies dinámicos. &lt;br /&gt;
Un excelente ejemplo de DSL interno es el propio jMock. &lt;br /&gt;
Los DSL internos también son llamados &amp;quot;fluent interface&amp;quot; o &amp;quot;fluent API&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Enlaces ==&lt;br /&gt;
[http://eamodeorubio.wordpress.com/2010/09/13/%C2%BFque-son-los-dsl-domain-specific-languages/ Fuente]&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5717</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5717"/>
				<updated>2011-04-26T18:17:20Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Tipos de DSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo:&lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL:&lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
Existe un ciclo de vida en la evolución de una solución a un problema dentro del software. Primero resolvemos el problema como se nos ocurra. Después, conforme ganamos experiencia, al resolver el problema varias veces en contextos distintos, encontramos buenas prácticas o “recetas”, que nos permiten resolver el problema mediante copy/paste. En una etapa posterior de maduración, conseguimos abstraer esas recetas, en una librería que sigue un determinado diseño, y obtenemos un patrón de diseño al abstraer el diseño de la implementación en si. Una vez que tenemos varios patrones de diseño que resuelven distintos problemas de la misma categoría, podemos implementarlos juntos, y obtenemos un framework. Finalmente, y este es el paso menos conocido, el framework se hace cada vez más configurable y automatizado, con lo que éste termina evolucionando en un DSL. &lt;br /&gt;
&lt;br /&gt;
== Tipos de DSL ==&lt;br /&gt;
Desde el punto de vista del tipo de problemas que resuelven, tenemos dos tipos de DSL, DSLs de negocio y DSLs técnicos. Sin embargo existe otra forma diferente de categorizar los DSLs, según el enfoque a la hora de implementarlos. De esta manera tenemos dos tipos:&lt;br /&gt;
&lt;br /&gt;
=== DSLs externos === &lt;br /&gt;
Un DSL externo es un lenguaje en si mismo, independiente de cualquier otro lenguaje. Posee su propia sintaxis, compilador y/o interprete, e incluso puede llegar a tener su propio IDE. Ejemplos de DSLs externos son SQL o ANTLR. &lt;br /&gt;
Los DSLs externos son el típico caso en el que uno piensa cuando se imagina un DSL, un lenguaje nuevo y aparte de los que ya existen.&lt;br /&gt;
&lt;br /&gt;
=== DSLs internos === &lt;br /&gt;
En este enfoque no construimos un lenguaje desde cero, sino que aprovechamos un lenguaje ya existente para construir nuestro DSL. Usando un poco de imaginación y exprimiendo los trucos del lenguaje anfitrión y su sintaxis, podemos construir una librería o framework que implemente el DSL de forma nativa al lenguaje anfitrión. Algunas técnicas usadas son los patrones “method chaining” y “builder”, el uso de métodos factoría estáticos, import estáticos, tipos y métodos paramétricos (genéricos) y por supuesto mucha reflexión, metaprogramación y los siempre agradecidos proxies dinámicos. &lt;br /&gt;
Un excelente ejemplo de DSL interno es el propio jMock. &lt;br /&gt;
Los DSL internos también son llamados &amp;quot;fluent interface&amp;quot; o &amp;quot;fluent API&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5716</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5716"/>
				<updated>2011-04-26T18:02:16Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Qué son los DSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo:&lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL:&lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
Existe un ciclo de vida en la evolución de una solución a un problema dentro del software. Primero resolvemos el problema como se nos ocurra. Después, conforme ganamos experiencia, al resolver el problema varias veces en contextos distintos, encontramos buenas prácticas o “recetas”, que nos permiten resolver el problema mediante copy/paste. En una etapa posterior de maduración, conseguimos abstraer esas recetas, en una librería que sigue un determinado diseño, y obtenemos un patrón de diseño al abstraer el diseño de la implementación en si. Una vez que tenemos varios patrones de diseño que resuelven distintos problemas de la misma categoría, podemos implementarlos juntos, y obtenemos un framework. Finalmente, y este es el paso menos conocido, el framework se hace cada vez más configurable y automatizado, con lo que éste termina evolucionando en un DSL. &lt;br /&gt;
&lt;br /&gt;
== Tipos de DSL ==&lt;br /&gt;
Desde el punto de vista del tipo de problemas que resuelven, tenemos dos tipos de DSL, DSLs de negocio y DSLs técnicos. Sin embargo existe otra forma diferente de categorizar los DSLs, según el enfoque a la hora de implementarlos. De esta manera tenemos dos tipos:&lt;br /&gt;
&lt;br /&gt;
DSLs externos. Un DSL externo es un lenguaje en si mismo, independiente de cualquier otro lenguaje. Posee su propia sintaxis, compilador y/o interprete, e incluso puede llegar a tener su propio IDE. Ejemplos de DSLs externos son SQL o ANTLR. Los DSLs externos son el típico caso en el que uno piensa cuando se imagina un DSL, un lenguaje nuevo y aparte de los que ya existen.&lt;br /&gt;
DSLs internos. En este enfoque no construimos un lenguaje desde cero, sino que aprovechamos un lenguaje ya existente para construir nuestro DSL. Usando un poco de imaginación y exprimiendo los trucos del lenguaje anfitrión y su sintaxis, podemos construir una librería o framework que implemente el DSL de forma nativa al lenguaje anfitrión. Algunas técnicas usadas son los patrones “method chaining” y “builder”, el uso de métodos factoría estáticos, import estáticos, tipos y métodos paramétricos (genéricos) y por supuesto mucha reflexión, metaprogramación y los siempre agradecidos proxies dinámicos. Un excelente ejemplo de DSL interno es el propio jMock. Los DSL internos también son llamados “fluent interface” o “fluent API”. Yo, pobre de mi, no sabía que existía esta denominación, por lo que se me ocurrió llamar “API Sexy” a un DSL que había construido, con el consiguiente cachondeo de mis compañeros.&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5715</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5715"/>
				<updated>2011-04-26T17:58:02Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Qué son los DSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo:&lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL:&lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5714</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5714"/>
				<updated>2011-04-26T17:57:38Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Qué son los DSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo: &lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL: &lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5713</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5713"/>
				<updated>2011-04-26T17:57:15Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Qué son los DSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo: &lt;br /&gt;
&lt;br /&gt;
* Definición de interfaces de usuario&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL: &lt;br /&gt;
&lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5712</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5712"/>
				<updated>2011-04-26T15:32:58Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Qué son los DSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. Se diferencian de los lenguajes de programación, que están pensados para resolver cualquier tipo de problemas (lenguajes generalistas). Estos últimos, lo que suman en generalidad, también lo hacen en complejidad. &lt;br /&gt;
&lt;br /&gt;
De esta forma nació el enfoque de los DSL, en vez de usar un lenguaje generalista, puedo usar diversos lenguajes de propósito específico, para resolver los diferentes problemas que surgen al implementar una aplicación. Por lo tanto sería muy eficiente contar con varios DSL, uno para cada tipo de problema con el que nos solemos encontrar, y para los problemas no tan típicos (los menos) solucionarlos con lenguajes generalistas. &lt;br /&gt;
&lt;br /&gt;
Se utilizan DSL para resolver por ejemplo: &lt;br /&gt;
* Definición de interfaces de usuario.&lt;br /&gt;
* Seguridad. &lt;br /&gt;
* Transacciones.&lt;br /&gt;
* Persistencia.&lt;br /&gt;
* Validación.&lt;br /&gt;
* Definición de tests automatizados &lt;br /&gt;
&lt;br /&gt;
Ejemplos de DSL: &lt;br /&gt;
* SQL&lt;br /&gt;
* XML&lt;br /&gt;
* HTML&lt;br /&gt;
* CSS&lt;br /&gt;
* JSP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5711</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5711"/>
				<updated>2011-04-26T15:19:49Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Qué son los DSL ==&lt;br /&gt;
&lt;br /&gt;
DSL (Domain Specific Languages) se llama a cualquier lenguaje que esté especializado en modelar o resolver un conjunto específico de problemas. &lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5710</id>
		<title>DSL</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=DSL&amp;diff=5710"/>
				<updated>2011-04-26T15:11:15Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: Página creada con 'Category: Diseño De Software'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Dise%C3%B1o_De_Software&amp;diff=5709</id>
		<title>Diseño De Software</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Dise%C3%B1o_De_Software&amp;diff=5709"/>
				<updated>2011-04-26T15:10:51Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El diseño de software es la tarea de representar en un lenguaje gráfico (usualmente [[UML]]) la solución de una problemática.&lt;br /&gt;
&lt;br /&gt;
==¿Qué es el diseño?==&lt;br /&gt;
&lt;br /&gt;
Supongo que todos, de una manera u otra, tenemos una idea de qué es diseñar: incluso quien menos cerca se encuentre de esta tarea sabe que, mínimamente, consiste en crear &amp;quot;cajitas con texto y muchas lineas&amp;quot; en alguna herramienta (electrónica o papel... muchos, me incluyo, empezamos sintiéndonos más cómodos con esta segunda opción; y es que a veces hasta resulta más facil pensar con un lapiz que con un mouse).&lt;br /&gt;
&lt;br /&gt;
Pero más allá de las ideas y sensaciones que puedan tener internamente, el diseño es una actividad básicamente creativa: es pensar de cero cómo se resolverá un problema. Es crear, de manera aún más abstracta que en la programación, una solución intangible a un problema.&lt;br /&gt;
&lt;br /&gt;
===Y el diseñador es...===&lt;br /&gt;
&lt;br /&gt;
El diseñador será entonces, obviamente, la persona de comprender el problema e idear la mejor solución al mismo para que pueda ser resuelto por otras personas. El diseñador no resuelve el problema directamente, es decir, no se encarga de programarlo: le brinda a los desarrolladores la visión que tiene para una mejor solución de la situación.&lt;br /&gt;
&lt;br /&gt;
Para poder comunicar su visión deberá, entonces, utilizar alguna herramienta para plasmar sus ideas (en la mente) en algo visible por personas que no posean poderes psíquicos. Actualmente, dicha herramienta se llama UML, y es un lenguaje visual que, con diagramas y notas, permite mostrar cómo un problema debe ser resuelto.&lt;br /&gt;
&lt;br /&gt;
===Pero el diseñador no es...===&lt;br /&gt;
&lt;br /&gt;
El diseñador no es el analista del problema: no puede suponer situaciones que no están explícitas en el caso de uso, ni es el experto en el área que tiene que resolver. Todas las dudas que tenga sobre el problema las deberá aclarar con el correspondiente analista, ya que él por si mismo no cuenta con los elementos necesarios para presuponer (adivinar) situaciones que le resulten confusas.&lt;br /&gt;
&lt;br /&gt;
El diseñador tampoco es desarrollador... y esto, en nuestro ámbito, suele &amp;quot;doler&amp;quot; un poco. El diseñador se encuentra muy cerca del código y debe conocer la plataforma y arquitectura donde se implementará su solución (puede construir los castillos de arena que considere necesario... pero siempre dentro de un arenero que él mismo no construyó). Pero si bien conoce del código y lenguaje de implementación, insisto, el diseñador no es quien programará la solución.&lt;br /&gt;
&lt;br /&gt;
Un buen diseñador debe conocer íntegramente la solución que quiere, y saber cómo quiere que se implemente en el lenguaje de turno. Por eso, personalmente pienso que un buen diseñador es, ante todo, un buen programador.&lt;br /&gt;
&lt;br /&gt;
===Yo diseño, tu programas; yo programo, tu diseñas===&lt;br /&gt;
&lt;br /&gt;
Esto último me parece importante destacar para no confudir: el rol del diseñador y desarrollador son distintos, y tienen responsabilidades distintas. Muchas veces tenemos la suerte de poder cumplir ambos roles (es decir, quienes diseñan algunas de las soluciones muchas veces participan luego directamente en la programación). Pero esta &amp;quot;dualidad&amp;quot; de roles no debe confundir las responsabilidades distintas que tienen.  Al momento de diseño se deberá pensar que es otra persona quien deba entender nuestras ideas. Y como desarrolladores, debemos pedir (exigir!) diseños claros que nos ayuden y faciliten la tarea.&lt;br /&gt;
&lt;br /&gt;
==Por qué diseñamos==&lt;br /&gt;
&lt;br /&gt;
El objetivo del diseño es doble: construir aplicaciones en menor tiempo y con mayor calidad.&lt;br /&gt;
&lt;br /&gt;
Pensar que se pierde tiempo diseñando es tener una visión muy pobre sobre la realidad: no se pierde tiempo en diseño, sino que se gana en construcción.&lt;br /&gt;
&lt;br /&gt;
Un buen diseño permite crear sistemas de mayor calidad, mantenibles y escalables: nos permitirá programar aplicaciones más fáciles de entender por personas no involucradas, que sean flexibles para que puedan adaptarse a los cambios del negocio rápidamente. Esto permitirá que la aplicación pueda evolucionar junto al negocio con el menor esfuerzo posible.&lt;br /&gt;
&lt;br /&gt;
Los problemas que aparecen al evitar (o escatimar) con la etapa de diseño son ampliamente conocidos y pueden leerse en varios libros, foros y notas. Y, obviamente como suele siempre pasar, a veces preferimos la &amp;quot;experiencia de primera mano&amp;quot;... cosa que también tenemos para contar. Tuvimos ya experiencias con proyectos donde la etapa de diseño fue, por diversos motivos, &amp;quot;relegada&amp;quot;... y sufrimos, a continuación, los problemas que todo librito avisa que siguen.&lt;br /&gt;
&lt;br /&gt;
Aprendamos entonces de experiencias pasadas, evitando pegarnos repetidas veces contra la misma pared. Recordemos que el tiempo por si mismo no brinda experiencia, sino tan solo situaciones. Es nuestra capacidad de aprender de estas situaciones lo que lleva a la experiencia y nos enriquece como profesionales.&lt;br /&gt;
&lt;br /&gt;
==El resultado de nuestro trabajo==&lt;br /&gt;
&lt;br /&gt;
Evidentemente, los sistemas que creamos son la cara visible de nuestro equipo y el resultado de nuestro trabajo; es la manera y el producto por el cual nos conocen. Crear soluciones de calidad habla bien de nosotros como equipo; debemos apuntar constantemente a mejorarnos, utilizando las herramientas existentes para ayudarnos en este proceso de aprendizaje y superación constante.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Diseño Por Contrato]]&lt;br /&gt;
* [[Patrones De Diseño]]&lt;br /&gt;
* [[Interfaces De Usuario]]&lt;br /&gt;
* [[UML]]&lt;br /&gt;
* [[DSL]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Diseño De Software]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Stored_Procedures_con_Hibernate&amp;diff=5123</id>
		<title>Stored Procedures con Hibernate</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Stored_Procedures_con_Hibernate&amp;diff=5123"/>
				<updated>2010-06-29T13:56:43Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Ver También */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hibernate 3 nos da soporte para queries vía Stored Procedures (SP) y Funciones. El Stored Procedure o la función, deben devolver un ResultSet en el primer parámetro de salida para que Hibernate lo soporte. &lt;br /&gt;
&lt;br /&gt;
== Reglas y limitaciones para el uso de Stored Procedures&amp;amp;nbsp; ==&lt;br /&gt;
&lt;br /&gt;
Hay ciertas reglas a respetar para que Hibernate funcione correctamente con los Stored Procedures. Si el mismo no respeta dichas reglas, se deberá ejecutar el Procedure vía session.connection().&lt;br /&gt;
&lt;br /&gt;
*SP queries no pueden ser paginadas con setFirstResult()/setMaxResults().&lt;br /&gt;
*La llamada recomendada es la estandar SQL92: { ? = call functionName(&amp;amp;lt;parameters&amp;amp;gt;) } o { ? = call procedureName(&amp;amp;lt;parameters&amp;amp;gt;}. Las llamadas nativas no son soportadas.&lt;br /&gt;
&lt;br /&gt;
Reglas que aplican para Oracle:&lt;br /&gt;
&lt;br /&gt;
*Una function debe retornar un Result Set. El primer parámetro de un SP debe ser un OUT que devuelva el Result Set&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver También ==&lt;br /&gt;
[[Hibernate]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://docs.jboss.org/hibernate/stable/core/reference/en/html/querysql.html#sp_query Documentación de Hibernate con Stored Procedure]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Stored_Procedures_con_Hibernate&amp;diff=5122</id>
		<title>Stored Procedures con Hibernate</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Stored_Procedures_con_Hibernate&amp;diff=5122"/>
				<updated>2010-06-29T13:56:15Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Ver También */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hibernate 3 nos da soporte para queries vía Stored Procedures (SP) y Funciones. El Stored Procedure o la función, deben devolver un ResultSet en el primer parámetro de salida para que Hibernate lo soporte. &lt;br /&gt;
&lt;br /&gt;
== Reglas y limitaciones para el uso de Stored Procedures&amp;amp;nbsp; ==&lt;br /&gt;
&lt;br /&gt;
Hay ciertas reglas a respetar para que Hibernate funcione correctamente con los Stored Procedures. Si el mismo no respeta dichas reglas, se deberá ejecutar el Procedure vía session.connection().&lt;br /&gt;
&lt;br /&gt;
*SP queries no pueden ser paginadas con setFirstResult()/setMaxResults().&lt;br /&gt;
*La llamada recomendada es la estandar SQL92: { ? = call functionName(&amp;amp;lt;parameters&amp;amp;gt;) } o { ? = call procedureName(&amp;amp;lt;parameters&amp;amp;gt;}. Las llamadas nativas no son soportadas.&lt;br /&gt;
&lt;br /&gt;
Reglas que aplican para Oracle:&lt;br /&gt;
&lt;br /&gt;
*Una function debe retornar un Result Set. El primer parámetro de un SP debe ser un OUT que devuelva el Result Set&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver También ==&lt;br /&gt;
[[Hibernate]]&lt;br /&gt;
[http://docs.jboss.org/hibernate/stable/core/reference/en/html/querysql.html#sp_query Documentación de Hibernate con Stored Procedure]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Stored_Procedures_con_Hibernate&amp;diff=5121</id>
		<title>Stored Procedures con Hibernate</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Stored_Procedures_con_Hibernate&amp;diff=5121"/>
				<updated>2010-06-29T13:55:00Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: Página creada con 'Hibernate 3 nos da soporte para queries vía Stored Procedures (SP) y Funciones. El Stored Procedure o la función, deben devolver un ResultSet en el primer parámetro de salida…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hibernate 3 nos da soporte para queries vía Stored Procedures (SP) y Funciones. El Stored Procedure o la función, deben devolver un ResultSet en el primer parámetro de salida para que Hibernate lo soporte. &lt;br /&gt;
&lt;br /&gt;
== Reglas y limitaciones para el uso de Stored Procedures&amp;amp;nbsp; ==&lt;br /&gt;
&lt;br /&gt;
Hay ciertas reglas a respetar para que Hibernate funcione correctamente con los Stored Procedures. Si el mismo no respeta dichas reglas, se deberá ejecutar el Procedure vía session.connection().&lt;br /&gt;
&lt;br /&gt;
*SP queries no pueden ser paginadas con setFirstResult()/setMaxResults().&lt;br /&gt;
*La llamada recomendada es la estandar SQL92: { ? = call functionName(&amp;amp;lt;parameters&amp;amp;gt;) } o { ? = call procedureName(&amp;amp;lt;parameters&amp;amp;gt;}. Las llamadas nativas no son soportadas.&lt;br /&gt;
&lt;br /&gt;
Reglas que aplican para Oracle:&lt;br /&gt;
&lt;br /&gt;
*Una function debe retornar un Result Set. El primer parámetro de un SP debe ser un OUT que devuelva el Result Set&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver También ==&lt;br /&gt;
[http://docs.jboss.org/hibernate/stable/core/reference/en/html/querysql.html#sp_query Documentación de Hibernate con Stored Procedure]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Hibernate&amp;diff=5120</id>
		<title>Hibernate</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Hibernate&amp;diff=5120"/>
				<updated>2010-06-29T13:41:54Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hibernate]]&lt;br /&gt;
Hibernate es un framework de persistencia de objetos para Java. Su función principal es la de [[Mapeo Objeto-Relacional]], es decir, mapear objetos a tablas de una base de datos relacional.&lt;br /&gt;
&lt;br /&gt;
Actualmente Hibernate cuanta con varios subproyectos que resuelven distintos aspectos del acceso y manipulación de datos.&lt;br /&gt;
&lt;br /&gt;
== Log de querys ==&lt;br /&gt;
Es posible decirle a Hibernate que realice un log de los comandos SQL que ejecuta. Esto resulta muy útil en tiempo de desarrollo. &lt;br /&gt;
&lt;br /&gt;
Para esto es necesario definir la propiedad ''show_sql'' en la configuración de Hibernate (generalmente, el archivo ''hibernate.cfg.xml''): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;show_sql&amp;quot;&amp;gt;true&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al ejecutar veremos algo como lo siguiente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code sql&amp;gt;&lt;br /&gt;
select emails0_.PERSON_ID as PERSON1_0_, emails0_.EMAIL_ADDR as EMAIL2_0_ &lt;br /&gt;
from PERSONA emails0_ &lt;br /&gt;
where emails0_.PERSON_ID=?&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si además queremos que el log aparezca mejor formateado, agregamos la variable ''format_sql'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;format_sql&amp;quot;&amp;gt;true&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y veremos: &lt;br /&gt;
&amp;lt;code sql&amp;gt;&lt;br /&gt;
select&lt;br /&gt;
    emails0_.PERSON_ID as PERSON1_0_,&lt;br /&gt;
    emails0_.EMAIL_ADDR as EMAIL2_0_&lt;br /&gt;
from&lt;br /&gt;
    PERSONA emails0_&lt;br /&gt;
where&lt;br /&gt;
    emails0_.PERSON_ID=?&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si ademas desean saber los valores de las bind variables, y variables de resultado que se utilizan en el query, deben configurar lo siguiente en el archivo ''log4j.properties'': &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    log4j.logger.org.hibernate.type=debug&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y veremos: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
12:30:56,551 DEBUG LongType:133 - binding '1' to parameter: 1&lt;br /&gt;
12:30:56,551 DEBUG LongType:172 - returning '1' as column: PERSON1_0_&lt;br /&gt;
12:30:56,567 DEBUG StringType:172 - returning 'demo@dosideas.com' as column: EMAIL2_0_&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra opción bastante interesante es ver el manejo de recursos por parte de Jdbc. Se debe agregar la propiedad: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    log4j.logger.org.hibernate.jdbc=debug&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y veremos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   12:30:56,551 - opening JDBC connection&lt;br /&gt;
12:30:56,553 - preparing statement&lt;br /&gt;
12:30:56,554 - about to open ResultSet (open ResultSets: 0, globally: 0)&lt;br /&gt;
12:30:57,551 - about to close ResultSet (open ResultSets: 1, globally: 1)&lt;br /&gt;
12:30:58,551 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)&lt;br /&gt;
12:30:58,552 - closing statement&lt;br /&gt;
12:30:56,553 - aggressively releasing JDBC connection&lt;br /&gt;
12:30:56,554 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) &lt;br /&gt;
(open ResultSets: 0, globally: 0)]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Cache De Hibernate]]&lt;br /&gt;
* [[Hibernate Con Spring]]&lt;br /&gt;
* [[Hibernate Annotations con Spring]]&lt;br /&gt;
* [[Actualizacion Dinamica Con Hibernate]]&lt;br /&gt;
* [[Eficiencia Ejecutando Querys Con Hibernate]]&lt;br /&gt;
* [[Stored Procedures con Hibernate]]&lt;br /&gt;
* [http://www.hibernate.org/ Web oficial de Hibernate]&lt;br /&gt;
* [http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html#tutorial-firstapp Tutorial de Hibernate]&lt;br /&gt;
* [http://www.javaworld.com/javaworld/jw-07-2008/jw-07-orm-comparison.html Comparación entre Hibernate, iBatis y JPA]&lt;br /&gt;
* [http://www.dosideas.com/java/180-testeando-rapido-todos-los-mapeos-de-hibernate.html Testear todos los mapeos de Hibernate]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Stored_Procedures_con_Spring&amp;diff=5115</id>
		<title>Stored Procedures con Spring</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Stored_Procedures_con_Spring&amp;diff=5115"/>
				<updated>2010-06-28T19:50:13Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Framework]] brinda una herramienta bastante práctica para invocar a [[Stored Procredures]] o funciones de forma de evitar el manejo de la conexión y facilitar el seteo de los parámetros. &lt;br /&gt;
&lt;br /&gt;
== SimpleJdbcCall  ==&lt;br /&gt;
&lt;br /&gt;
Es una clase que provee Spring que representa la llamada a un stored procedure o store function. Se diferencia de cualquier otra clase utilitaria por leer la meta data de la base de datos, permitiendo que solo tengamos que pasarle en la invocación un map con los nombres de los parámetros y sus respectivos valores. No hace falta especificar los tipos de datos. Adicionalmente encapsula el manejo de la conexión y del statement (internamente usa otra clase mas genérica de Spring para JDBC llamada JdbcTemplate). &lt;br /&gt;
&lt;br /&gt;
Como depende de la información que brinda la meta data, que es obtenida por el driver JDBC, las bases soportadas son Derby, MySQL, Microsoft SQL Server, Oracle y DB2. &lt;br /&gt;
&lt;br /&gt;
=== Ejemplo invocación  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class MiDao  {&lt;br /&gt;
    &lt;br /&gt;
    private SimpleJdbcCall miStoreProcedureCall;   &lt;br /&gt;
        &lt;br /&gt;
    public void buscarDireccion(String pametro1, String parametro2) {  &lt;br /&gt;
        SqlParameterSource mapIn = new MapSqlParameterSource()&lt;br /&gt;
        .addValue(&amp;quot;CODIGO_CLIENTE&amp;quot;, pametro1)&lt;br /&gt;
        .addValue(&amp;quot;NUMERO_DOCUMENTO&amp;quot;, parametro2);&lt;br /&gt;
        &lt;br /&gt;
        Map&amp;lt;String, Object&amp;gt; out = getMiStoreProcedureCall().execute(mapIn);&lt;br /&gt;
&lt;br /&gt;
        String direccionCliente = (String) out.get(&amp;quot;DIRECCION&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Invocacion exitosa. Direccion cliente: &amp;quot; + direccionCliente);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo de invocacion a un procedure con cursor  ===&lt;br /&gt;
&lt;br /&gt;
Cuando invocamos un procedure que retorna un cursor podemos especificar a que tipo de dato queremos que nos convierta el resultado. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  public Collection&amp;lt;Linea&amp;gt; buscarLineasPorTitular(@NotNull Titular titular) {&lt;br /&gt;
&lt;br /&gt;
        SqlParameterSource parametrosPackage = new MapSqlParameterSource()&lt;br /&gt;
                .addValue(&amp;quot;P_TIPO_DOCUMENTO&amp;quot;, titular.getTipoDocumento(), Types.VARCHAR)&lt;br /&gt;
                .addValue(&amp;quot;P_NUMERO_DOCUMENTO&amp;quot;, titular.getNumeroDocumento().toString(), Types.VARCHAR);&lt;br /&gt;
&lt;br /&gt;
        Map&amp;lt;String, Object&amp;gt; out = getSimpleJdbcCall()&lt;br /&gt;
                .withoutProcedureColumnMetaDataAccess()&lt;br /&gt;
                .declareParameters(&lt;br /&gt;
                        new SqlParameter(&amp;quot;P_TIPO_DOCUMENTO&amp;quot;, Types.VARCHAR),&lt;br /&gt;
                        new SqlParameter(&amp;quot;P_NUMERO_DOCUMENTO&amp;quot;, Types.VARCHAR))&lt;br /&gt;
               .returningResultSet(&amp;quot;P_LINEAS&amp;quot;,  ParameterizedBeanPropertyRowMapper.newInstance(Linea.class))&lt;br /&gt;
               .execute(parametrosPackage);&lt;br /&gt;
&lt;br /&gt;
        return (Collection&amp;lt;Linea&amp;gt;) out.get(&amp;quot;P_LINEAS&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
En este ejemplo seteamos que los datos del cursor(P_LINEAS) los convierta a la clase Linea y spring mapea los nombres de las columnas con los nombres de los atributos. &lt;br /&gt;
&lt;br /&gt;
===== Por ejemplo:  =====&lt;br /&gt;
&lt;br /&gt;
-si el nombre de la columna es NUMERO_DOCUMENTO spring va a llamar a linea.setNumeroDocumento(..). &amp;lt;br&amp;gt; -si el nombre de la columna es sistema spring va a llamar a linea.setSistema(..).&lt;br /&gt;
&lt;br /&gt;
=== Configuración  ===&lt;br /&gt;
&lt;br /&gt;
En el ejemplo se decidió por inyectar la clase utilitaria, utilizando configuración en xml. De igual manera se podría haber hecho en el mismo código Java. &lt;br /&gt;
&lt;br /&gt;
La clase SimpleJdbcCall necesita como parámetro del constructor el data source asociado a la base de datos en la cual se encuentra el store procedure. &lt;br /&gt;
&lt;br /&gt;
En el ejemplo, el procedure se encuentra dentro de un package y de ahí una propiedad extra que hay que configurar (sino simplemente obviarla). Archivo xml: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;beans&amp;gt;&lt;br /&gt;
  &amp;lt;bean id=&amp;quot;dataSourceApp&amp;quot; class=&amp;quot;org.springframework.jndi.JndiObjectFactoryBean&amp;quot; &lt;br /&gt;
        destroy-method=&amp;quot;close&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;jndiName&amp;quot; value=&amp;quot;jdbc/miApp&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/bean&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;bean id=&amp;quot;jdbc.miStoreP&amp;quot; class=&amp;quot;org.springframework.jdbc.core.simple.SimpleJdbcCall&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;constructor-arg ref=&amp;quot;dataSourceApp&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;procedureName&amp;quot; value=&amp;quot;BUSCAR_DIRECCION&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;catalogName&amp;quot; value=&amp;quot;PACKAGE_CLIENTES&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;bean id=&amp;quot;dao.MiDao&amp;quot; class=&amp;quot;com.dosideas.MiDao&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;property name=&amp;quot;miStoreProcedureCall&amp;quot; ref=&amp;quot;jdbc.miStoreP&amp;quot;/&amp;gt;        &lt;br /&gt;
  &amp;lt;/bean&amp;gt;    &lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Schema  ==&lt;br /&gt;
&lt;br /&gt;
Como se menciono anteriormente, esta clase se basa en la obtención de la meta data. Para asegurarnos de que la obtenga correctamente debemos saber mas en detalle como la obtiene. Si corremos el ejemplo con un nivel de log en debug vamos a ver lo siguiente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Retrieving metadata for PACKAGE_CLIENTES/SCHEMA/BUSCAR_DIRECCION&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Si el dueño (owner) del package es diferente al del schema al cual nos estamos conectado, no va a poder obtener la meta data, aunque el mismo tenga un sinónimo publico. Lo importante es que Spring no da error en estos casos, sino que continua con la invocación. En nuestro caso seria algo del tipo: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Compiled stored procedure. Call string is [{call PACKAGE_CLIENTES.BUSCAR_DIRECCION()}]&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Luego la base de datos nos dara un error indicando que estamos invocando al procedure con una cantidad incorrecta de parametros (ninguno), ocultado el error que origina todo esto. &lt;br /&gt;
&lt;br /&gt;
Para solucionarlo basta con modificar la llamada al execute de SimpleJdbcCall de la siguiente forma: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Map&amp;lt;String, Object&amp;gt; out = getMiStoreProcedureCall().withSchemaName(&amp;quot;MI_ESQUEMA&amp;quot;)&lt;br /&gt;
                                                   .execute(mapIn);&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Ver también  ==&lt;br /&gt;
&lt;br /&gt;
*[http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html#jdbc-simple-jdbc-call-1 Documentacion de spring con JDBC]&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring_Framework]] [[Category:Base_De_Datos]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SoapUI_Con_JUnit&amp;diff=5086</id>
		<title>SoapUI Con JUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SoapUI_Con_JUnit&amp;diff=5086"/>
				<updated>2010-06-24T14:25:07Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es muy fácil incorporar la suite de test [[JUnit]] generada por [[SoapUI]] a nuestro proyecto y poder así sumar estos test a los test de integración de nuestra aplicación. &lt;br /&gt;
&lt;br /&gt;
Librerias a incluir en el modulo de test de nuestro proyecto: &lt;br /&gt;
&lt;br /&gt;
*bcprov-jdk15-138.jar &lt;br /&gt;
*commons-beanutils.jar &lt;br /&gt;
*commons-cli.jar &lt;br /&gt;
*commons-codec.jar &lt;br /&gt;
*commons-httpclient.jar &lt;br /&gt;
*not-yet-commons-ssl.jar &lt;br /&gt;
*soapui.jar &lt;br /&gt;
*soapui-xmlbeans.jar &lt;br /&gt;
*soap-xmlbeans.jar &lt;br /&gt;
*xbean-fixed.jar &lt;br /&gt;
*xmlpublic.jar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; De esta manera corremos la batería completa de test de un proyecto. Hay que tener en cuenta que al tener un solo test para toda la batería, cuando surge un error no se continúa con el resto de los test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundo() throws Exception &lt;br /&gt;
{&lt;br /&gt;
	SoapUITestCaseRunner runner = new SoapUITestCaseRunner(); &lt;br /&gt;
	runner.setProjectFile( &amp;quot;src/dist/HolaMundo-soapui-project.xml&amp;quot; );&lt;br /&gt;
	runner.run(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
También existe la posibilidad de correr individualmente cada uno de los test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WsdlProject wsdlProject = null;&lt;br /&gt;
TestSuite testSuite = null;&lt;br /&gt;
&lt;br /&gt;
@Before&lt;br /&gt;
public void setUp() throws Exception {&lt;br /&gt;
&lt;br /&gt;
        wsdlProject = new WsdlProject(&amp;quot;src/dist/HolaMundo-soapui-project.xml&amp;quot;);&lt;br /&gt;
        testSuite = wsdlProject.getTestSuiteByName(&amp;quot;HolaMundo&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundoOk() {&lt;br /&gt;
&lt;br /&gt;
        TestCase testCase = testSuite.getTestCaseByName(&amp;quot;HolaMundoOk&amp;quot;);&lt;br /&gt;
        TestRunner runner = testCase.run(new PropertiesMap(), false);&lt;br /&gt;
        assertEquals(Status.FINISHED, runner.getStatus());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundoError() {&lt;br /&gt;
&lt;br /&gt;
        TestCase testCase = testSuite.getTestCaseByName(&amp;quot;HolaMundoError&amp;quot;);&lt;br /&gt;
        TestRunner runner = testCase.run(new PropertiesMap(), false);&lt;br /&gt;
        assertEquals(Status.FINISHED, runner.getStatus());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Problemas con Assertions  ==&lt;br /&gt;
&lt;br /&gt;
Se presentan ciertos problemas al correr los test SoapUi con JUnit. &lt;br /&gt;
&lt;br /&gt;
Soapui propone muchas formas para realizar assert sobre el response de un ws, a continuación un breve explicación de cada una: &lt;br /&gt;
&lt;br /&gt;
*'''WS-security status'''&amp;amp;nbsp;: Chequea que el reponse tenga un encabezado ws-security válido. &lt;br /&gt;
*'''not soap fault'''&amp;amp;nbsp;: Chequea que el response no sea un fault. &lt;br /&gt;
*'''Response SLA'''&amp;amp;nbsp;: Chequea que el response haya tardado menos del tiempo configurado. &lt;br /&gt;
*'''SOAP response''': Chequea que el response sea un mensaje soap. &lt;br /&gt;
*'''Script assertion''': Permite hacer scrips de groovy para realizar assert con el response. &lt;br /&gt;
*'''WS adressing response''': Chequea que el encabezado del resopnse tenga propiedades válidas. &lt;br /&gt;
*'''Contains''': Chequea que el response contenga un valor o un tag con un valor determinado. &lt;br /&gt;
*'''Not Contains''': Chequea que el response no contenga un valor o un tag con un valor determinado. &lt;br /&gt;
*'''xQuery math''': Permite chequear el contenido del response con expresiones de xquery 2.0. &lt;br /&gt;
*'''Schema Compliance''': Chequea que el response sea compatible con un shema dado. &lt;br /&gt;
*'''xPath match''': Permite chquear el contenido del response con expresiones de xPath. &lt;br /&gt;
*'''Soap fault''': Chequea que el response sea un fault.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Estos assert son muy completos y muy fáciles de usar con el sopUI, pero una vez que guardamos un proyecto y lo importamos para correr los test de junit, los mismos fallan (retorna status FAILD). Entonces, para que los test corran automáticamente, vía junit, los únicos assert que se pueden hacer son los del tipo “contains” y “soap response”, cualquier otro tipo de assert falla. En principio con los contains se pueden hacer asserts sobre todo el response, pero tienen una serie de limitaciones: solo permite hacer assert por tag, es decir, que no se puede hacer un assert del xml completo, con lo cual si el xml del response tiene 20 tag, habrá que hacer 20 assert distintos. Otro punto en contra es que no hay un forma con las assertions para testeas los tags en el caso de que nuestro WebServices retorne una colección de datos, ya que es estos casos hace un assert sobre todo el xml, sin controlar la cantidad. &lt;br /&gt;
&lt;br /&gt;
== Ver también  ==&lt;br /&gt;
&lt;br /&gt;
*[[Mock de un web service con Jetty|Alternativa a SoapUI utilizando Jetty]] &lt;br /&gt;
*[http://www.soapui.org/userguide/commandline/functional.html SoapUITestCaseRunner ]&lt;br /&gt;
&lt;br /&gt;
[[Category:Web_Service]] [[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SoapUI_Con_JUnit&amp;diff=5085</id>
		<title>SoapUI Con JUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SoapUI_Con_JUnit&amp;diff=5085"/>
				<updated>2010-06-24T14:24:41Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es muy fácil incorporar la suite de test [[JUnit]] generada por [[SoapUI]] a nuestro proyecto y poder así sumar estos test a los test de integración de nuestra aplicación. &lt;br /&gt;
&lt;br /&gt;
Librerias a incluir en el modulo de test de nuestro proyecto: &lt;br /&gt;
&lt;br /&gt;
*bcprov-jdk15-138.jar &lt;br /&gt;
*commons-beanutils.jar &lt;br /&gt;
*commons-cli.jar &lt;br /&gt;
*commons-codec.jar &lt;br /&gt;
*commons-httpclient.jar &lt;br /&gt;
*not-yet-commons-ssl.jar &lt;br /&gt;
*soapui.jar &lt;br /&gt;
*soapui-xmlbeans.jar &lt;br /&gt;
*soap-xmlbeans.jar &lt;br /&gt;
*xbean-fixed.jar &lt;br /&gt;
*xmlpublic.jar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; De esta manera corremos la batería completa de test de un proyecto. Hay que tener en cuenta que al tener un solo test para toda la batería, cuando surge un error no se continúa con el resto de los test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundo() throws Exception &lt;br /&gt;
{&lt;br /&gt;
	SoapUITestCaseRunner runner = new SoapUITestCaseRunner(); &lt;br /&gt;
	runner.setProjectFile( &amp;quot;src/dist/HolaMundo-soapui-project.xml&amp;quot; );&lt;br /&gt;
	runner.run(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
También existe la posibilidad de correr individualmente cada uno de los test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WsdlProject wsdlProject = null;&lt;br /&gt;
TestSuite testSuite = null;&lt;br /&gt;
&lt;br /&gt;
@Before&lt;br /&gt;
public void setUp() throws Exception {&lt;br /&gt;
&lt;br /&gt;
        wsdlProject = new WsdlProject(&amp;quot;src/dist/HolaMundo-soapui-project.xml&amp;quot;);&lt;br /&gt;
        testSuite = wsdlProject.getTestSuiteByName(&amp;quot;HolaMundo&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundoOk() {&lt;br /&gt;
&lt;br /&gt;
        TestCase testCase = testSuite.getTestCaseByName(&amp;quot;HolaMundoOk&amp;quot;);&lt;br /&gt;
        TestRunner runner = testCase.run(new PropertiesMap(), false);&lt;br /&gt;
        assertEquals(Status.FINISHED, runner.getStatus());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundoError() {&lt;br /&gt;
&lt;br /&gt;
        TestCase testCase = testSuite.getTestCaseByName(&amp;quot;HolaMundoError&amp;quot;);&lt;br /&gt;
        TestRunner runner = testCase.run(new PropertiesMap(), false);&lt;br /&gt;
        assertEquals(Status.FINISHED, runner.getStatus());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Problemas con Assertions  ==&lt;br /&gt;
&lt;br /&gt;
Se presentan ciertos problemas al correr los test SoapUi con JUnit. &lt;br /&gt;
&lt;br /&gt;
Soapui propone muchas formas para realizar assert sobre el response de un ws, a continuación un breve explicación de cada una: &lt;br /&gt;
&lt;br /&gt;
*'''WS-security status'''&amp;amp;nbsp;: Chequea que el reponse tenga un encabezado ws-security válido. &lt;br /&gt;
*'''not soap fault'''&amp;amp;nbsp;: Chequea que el response no sea un fault. &lt;br /&gt;
*'''Response SLA'''&amp;amp;nbsp;: Chequea que el response haya tardado menos del tiempo configurado. &lt;br /&gt;
*'''SOAP response''': Chequea que el response sea un mensaje soap. &lt;br /&gt;
*'''Script assertion''': Permite hacer scrips de groovy para realizar assert con el response. &lt;br /&gt;
*'''WS adressing response''': Chequea que el encabezado del resopnse tenga propiedades válidas. &lt;br /&gt;
*'''Contains''': Chequea que el response contenga un valor o un tag con un valor determinado. &lt;br /&gt;
*'''Not Contains''': Chequea que el response no contenga un valor o un tag con un valor determinado. &lt;br /&gt;
*'''xQuery math''': Permite chequear el contenido del response con expresiones de xquery 2.0. &lt;br /&gt;
*'''Schema Compliance''': Chequea que el response sea compatible con un shema dado. &lt;br /&gt;
*'''xPath match''': Permite chquear el contenido del response con expresiones de xPath. &lt;br /&gt;
*'''Soap fault''': Chequea que el response sea un fault.&lt;br /&gt;
&lt;br /&gt;
Estos assert son muy completos y muy fáciles de usar con el sopUI, pero una vez que guardamos un proyecto y lo importamos para correr los test de junit, los mismos fallan (retorna status FAILD). Entonces, para que los test corran automáticamente, vía junit, los únicos assert que se pueden hacer son los del tipo “contains” y “soap response”, cualquier otro tipo de assert falla. En principio con los contains se pueden hacer asserts sobre todo el response, pero tienen una serie de limitaciones: solo permite hacer assert por tag, es decir, que no se puede hacer un assert del xml completo, con lo cual si el xml del response tiene 20 tag, habrá que hacer 20 assert distintos. Otro punto en contra es que no hay un forma con las assertions para testeas los tags en el caso de que nuestro WebServices retorne una colección de datos, ya que es estos casos hace un assert sobre todo el xml, sin controlar la cantidad. &lt;br /&gt;
&lt;br /&gt;
== Ver también  ==&lt;br /&gt;
&lt;br /&gt;
*[[Mock de un web service con Jetty|Alternativa a SoapUI utilizando Jetty]] &lt;br /&gt;
*[http://www.soapui.org/userguide/commandline/functional.html SoapUITestCaseRunner ]&lt;br /&gt;
&lt;br /&gt;
[[Category:Web_Service]] [[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SoapUI_Con_JUnit&amp;diff=5084</id>
		<title>SoapUI Con JUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SoapUI_Con_JUnit&amp;diff=5084"/>
				<updated>2010-06-24T14:23:28Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es muy fácil incorporar la suite de test [[JUnit]] generada por [[SoapUI]] a nuestro proyecto y poder así sumar estos test a los test de integración de nuestra aplicación. &lt;br /&gt;
&lt;br /&gt;
Librerias a incluir en el modulo de test de nuestro proyecto: &lt;br /&gt;
&lt;br /&gt;
*bcprov-jdk15-138.jar &lt;br /&gt;
*commons-beanutils.jar &lt;br /&gt;
*commons-cli.jar &lt;br /&gt;
*commons-codec.jar &lt;br /&gt;
*commons-httpclient.jar &lt;br /&gt;
*not-yet-commons-ssl.jar &lt;br /&gt;
*soapui.jar &lt;br /&gt;
*soapui-xmlbeans.jar &lt;br /&gt;
*soap-xmlbeans.jar &lt;br /&gt;
*xbean-fixed.jar &lt;br /&gt;
*xmlpublic.jar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; De esta manera corremos la batería completa de test de un proyecto. Hay que tener en cuenta que al tener un solo test para toda la batería, cuando surge un error no se continúa con el resto de los test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundo() throws Exception &lt;br /&gt;
{&lt;br /&gt;
	SoapUITestCaseRunner runner = new SoapUITestCaseRunner(); &lt;br /&gt;
	runner.setProjectFile( &amp;quot;src/dist/HolaMundo-soapui-project.xml&amp;quot; );&lt;br /&gt;
	runner.run(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
También existe la posibilidad de correr individualmente cada uno de los test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WsdlProject wsdlProject = null;&lt;br /&gt;
TestSuite testSuite = null;&lt;br /&gt;
&lt;br /&gt;
@Before&lt;br /&gt;
public void setUp() throws Exception {&lt;br /&gt;
&lt;br /&gt;
        wsdlProject = new WsdlProject(&amp;quot;src/dist/HolaMundo-soapui-project.xml&amp;quot;);&lt;br /&gt;
        testSuite = wsdlProject.getTestSuiteByName(&amp;quot;HolaMundo&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundoOk() {&lt;br /&gt;
&lt;br /&gt;
        TestCase testCase = testSuite.getTestCaseByName(&amp;quot;HolaMundoOk&amp;quot;);&lt;br /&gt;
        TestRunner runner = testCase.run(new PropertiesMap(), false);&lt;br /&gt;
        assertEquals(Status.FINISHED, runner.getStatus());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundoError() {&lt;br /&gt;
&lt;br /&gt;
        TestCase testCase = testSuite.getTestCaseByName(&amp;quot;HolaMundoError&amp;quot;);&lt;br /&gt;
        TestRunner runner = testCase.run(new PropertiesMap(), false);&lt;br /&gt;
        assertEquals(Status.FINISHED, runner.getStatus());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Problemas con Assertions ==&lt;br /&gt;
&lt;br /&gt;
Se presentan ciertos problemas al correr los test SoapUi con JUnit.&lt;br /&gt;
&lt;br /&gt;
Soapui propone muchas formas para realizar assert sobre el response de un ws, a continuación un breve explicación de cada una: &lt;br /&gt;
&lt;br /&gt;
'''WS-security status''' : Chequea que el reponse tenga un encabezado ws-security válido.&lt;br /&gt;
'''not soap fault''' : Chequea que el response no sea un fault.&lt;br /&gt;
'''Response SLA''' : Chequea que el response haya tardado menos del tiempo configurado.&lt;br /&gt;
'''SOAP response''': Chequea que el response sea un mensaje soap.&lt;br /&gt;
'''Script assertion''': Permite hacer scrips de groovy para realizar assert con el response.&lt;br /&gt;
'''WS adressing response''': Chequea que el encabezado del resopnse tenga propiedades válidas.&lt;br /&gt;
'''Contains''': Chequea que el response contenga un valor o un tag con un valor determinado.&lt;br /&gt;
'''Not Contains''': Chequea que el response no contenga un valor o un tag con un valor determinado.&lt;br /&gt;
'''xQuery math''': Permite chequear el contenido del response con expresiones de xquery 2.0.&lt;br /&gt;
'''Schema Compliance''': Chequea que el response sea compatible con un shema dado.&lt;br /&gt;
'''xPath match''': Permite chquear el contenido del response con expresiones de xPath.&lt;br /&gt;
'''Soap fault''': Chequea que el response sea un fault.&lt;br /&gt;
&lt;br /&gt;
Estos assert son muy completos y muy fáciles de usar con el sopUI, pero una vez que guardamos un proyecto y lo importamos para correr los test de junit, los mismos fallan (retorna status FAILD). &lt;br /&gt;
Entonces, para que los test corran automáticamente, vía junit, los únicos assert que se pueden hacer son los del tipo “contains” y “soap response”, cualquier otro tipo de assert falla.&lt;br /&gt;
En principio con los contains se pueden hacer asserts sobre todo el response, pero tienen una serie de limitaciones: solo permite hacer assert por tag, es decir, que no se puede hacer un assert del xml completo, con lo cual si el xml del response tiene 20 tag, habrá que hacer 20 assert distintos. Otro punto en contra es que no hay un forma con las assertions para testeas los tags en el caso de que nuestro WebServices retorne una colección de datos, ya que es estos casos hace un assert sobre todo el xml, sin controlar la cantidad.&lt;br /&gt;
&lt;br /&gt;
== Ver también  ==&lt;br /&gt;
&lt;br /&gt;
*[[Mock_de_un_web_service_con_Jetty|Alternativa a SoapUI utilizando Jetty]]&lt;br /&gt;
*[http://www.soapui.org/userguide/commandline/functional.html SoapUITestCaseRunner ]&lt;br /&gt;
&lt;br /&gt;
[[Category:Web_Service]] [[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SoapUI_Con_JUnit&amp;diff=5083</id>
		<title>SoapUI Con JUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SoapUI_Con_JUnit&amp;diff=5083"/>
				<updated>2010-06-24T14:22:12Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es muy fácil incorporar la suite de test [[JUnit]] generada por [[SoapUI]] a nuestro proyecto y poder así sumar estos test a los test de integración de nuestra aplicación. &lt;br /&gt;
&lt;br /&gt;
Librerias a incluir en el modulo de test de nuestro proyecto: &lt;br /&gt;
&lt;br /&gt;
*bcprov-jdk15-138.jar &lt;br /&gt;
*commons-beanutils.jar &lt;br /&gt;
*commons-cli.jar &lt;br /&gt;
*commons-codec.jar &lt;br /&gt;
*commons-httpclient.jar &lt;br /&gt;
*not-yet-commons-ssl.jar &lt;br /&gt;
*soapui.jar &lt;br /&gt;
*soapui-xmlbeans.jar &lt;br /&gt;
*soap-xmlbeans.jar &lt;br /&gt;
*xbean-fixed.jar &lt;br /&gt;
*xmlpublic.jar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; De esta manera corremos la batería completa de test de un proyecto. Hay que tener en cuenta que al tener un solo test para toda la batería, cuando surge un error no se continúa con el resto de los test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundo() throws Exception &lt;br /&gt;
{&lt;br /&gt;
	SoapUITestCaseRunner runner = new SoapUITestCaseRunner(); &lt;br /&gt;
	runner.setProjectFile( &amp;quot;src/dist/HolaMundo-soapui-project.xml&amp;quot; );&lt;br /&gt;
	runner.run(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
También existe la posibilidad de correr individualmente cada uno de los test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WsdlProject wsdlProject = null;&lt;br /&gt;
TestSuite testSuite = null;&lt;br /&gt;
&lt;br /&gt;
@Before&lt;br /&gt;
public void setUp() throws Exception {&lt;br /&gt;
&lt;br /&gt;
        wsdlProject = new WsdlProject(&amp;quot;src/dist/HolaMundo-soapui-project.xml&amp;quot;);&lt;br /&gt;
        testSuite = wsdlProject.getTestSuiteByName(&amp;quot;HolaMundo&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundoOk() {&lt;br /&gt;
&lt;br /&gt;
        TestCase testCase = testSuite.getTestCaseByName(&amp;quot;HolaMundoOk&amp;quot;);&lt;br /&gt;
        TestRunner runner = testCase.run(new PropertiesMap(), false);&lt;br /&gt;
        assertEquals(Status.FINISHED, runner.getStatus());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundoError() {&lt;br /&gt;
&lt;br /&gt;
        TestCase testCase = testSuite.getTestCaseByName(&amp;quot;HolaMundoError&amp;quot;);&lt;br /&gt;
        TestRunner runner = testCase.run(new PropertiesMap(), false);&lt;br /&gt;
        assertEquals(Status.FINISHED, runner.getStatus());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Problemas con Assertions ==&lt;br /&gt;
&lt;br /&gt;
Se presentan ciertos problemas al correr los test SoapUi con JUnit.&lt;br /&gt;
&lt;br /&gt;
Soapui propone muchas formas para realizar assert sobre el response de un ws, a continuación un breve explicación de cada una: &lt;br /&gt;
&lt;br /&gt;
'''WS-security status''' : Chequea que el reponse tenga un encabezado ws-security válido.&lt;br /&gt;
'''not soap fault''' : Chequea que el response no sea un fault.&lt;br /&gt;
'''Response SLA''' : Chequea que el response haya tardado menos del tiempo configurado.&lt;br /&gt;
'''SOAP response''': Chequea que el response sea un mensaje soap.&lt;br /&gt;
'''Script assertion''': Permite hacer scrips de groovy para realizar assert con el response.&lt;br /&gt;
'''WS adressing response''': Chequea que el encabezado del resopnse tenga propiedades válidas. &lt;br /&gt;
'''Contains''': Chequea que el response contenga un valor o un tag con un valor determinado.&lt;br /&gt;
'''Not Contains''': Chequea que el response no contenga un valor o un tag con un valor determinado.&lt;br /&gt;
'''xQuery math''': Permite chequear el contenido del response con expresiones de xquery 2.0.&lt;br /&gt;
'''Schema Compliance''': Chequea que el response sea compatible con un shema dado.&lt;br /&gt;
'''xPath match''': Permite chquear el contenido del response con expresiones de xPath.&lt;br /&gt;
'''Soap fault''': Chequea que el response sea un fault.&lt;br /&gt;
&lt;br /&gt;
Estos assert son muy completos y muy fáciles de usar con el sopUI, pero una vez que guardamos un proyecto y lo importamos para correr los test de junit, los mismos fallan (retorna status FAILD). &lt;br /&gt;
Entonces, para que los test corran automáticamente, vía junit, los únicos assert que se pueden hacer son los del tipo “contains” y “soap response”, cualquier otro tipo de assert falla.&lt;br /&gt;
En principio con los contains se pueden hacer asserts sobre todo el response, pero tienen una serie de limitaciones: solo permite hacer assert por tag, es decir, que no se puede hacer un assert del xml completo, con lo cual si el xml del response tiene 20 tag, habrá que hacer 20 assert distintos. Otro punto en contra es que no hay un forma con las assertions para testeas los tags en el caso de que nuestro WebServices retorne una colección de datos, ya que es estos casos hace un assert sobre todo el xml, sin controlar la cantidad.&lt;br /&gt;
&lt;br /&gt;
== Ver también  ==&lt;br /&gt;
&lt;br /&gt;
*[[Mock_de_un_web_service_con_Jetty|Alternativa a SoapUI utilizando Jetty]]&lt;br /&gt;
*[http://www.soapui.org/userguide/commandline/functional.html SoapUITestCaseRunner ]&lt;br /&gt;
&lt;br /&gt;
[[Category:Web_Service]] [[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Castor&amp;diff=5082</id>
		<title>Castor</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Castor&amp;diff=5082"/>
				<updated>2010-06-24T14:14:48Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.castor.org/ Castor] es un framework Open Source para Java, para transformaciones de Xml a Objetos Java y viceversa. &lt;br /&gt;
&lt;br /&gt;
Es un gran herramienta para utilizar con [[Spring Web Services]], ya que se complementa mejor que otros frameworks (por ejemplo, XStream) a las definiciones de wsdl con Namespaces. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ver También ==&lt;br /&gt;
[http://www.castor.org/ Sitio Oficial de Castor]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Castor&amp;diff=5081</id>
		<title>Castor</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Castor&amp;diff=5081"/>
				<updated>2010-06-24T14:05:26Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.castor.org/ Castor]es un framework Open Source para Java, para transformaciones de Xml a Objetos Java y viceversa. &lt;br /&gt;
&lt;br /&gt;
Es un gran herramienta para utilizar con [[Spring Web Services]], ya que se complementa mejor que otros frameworks (por ejemplo, XStream) a las definiciones de wsdl con Namespaces. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ver También ==&lt;br /&gt;
[http://www.castor.org/ Sitio Oficial de Castor]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Castor&amp;diff=5080</id>
		<title>Castor</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Castor&amp;diff=5080"/>
				<updated>2010-06-24T14:04:59Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.castor.org/ Castor]es un framework Open Source para Java, para transformaciones de Xml a Objetos Java y viceversa. &lt;br /&gt;
&lt;br /&gt;
Es un gran herramienta para utilizar con [[Spring Web Services], ya que se complementa mejor que otros frameworks (por ejemplo, XStream) a las definiciones de wsdl con Namespaces. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ver También ==&lt;br /&gt;
[http://www.castor.org/ Sitio Oficial de Castor]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Castor&amp;diff=5079</id>
		<title>Castor</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Castor&amp;diff=5079"/>
				<updated>2010-06-24T14:00:14Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: Página creada con '[http://www.castor.org/ Castor] is an Open Source data binding framework for Java[tm]. It's the shortest path between Java objects, XML documents and relational tables. Castor p…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.castor.org/ Castor] is an Open Source data binding framework for Java[tm]. It's the shortest path between Java objects, XML documents and relational tables. Castor provides Java-to-XML binding, Java-to-SQL persistence, and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Castor es un framework Open Source para Java, para transformaciones de Xml a Objetos Java y viceversa. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ver También ==&lt;br /&gt;
[http://www.castor.org/ Sitio Oficial de Castor]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Spring_Web_Services&amp;diff=5078</id>
		<title>Spring Web Services</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Spring_Web_Services&amp;diff=5078"/>
				<updated>2010-06-24T13:57:45Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Spring Web Services]] (Spring-WS) es un producto de [[Spring Framework]] para facilitar la creación de servicios web basados en el intercambio de documentos (document driven). &lt;br /&gt;
&lt;br /&gt;
Spring-WS Se basa en servicios en los cuales primero se establece un contrato y luego se implementan (contract first), evitando atar al contrato como sucede en los casos en los cuales se genera el mismo a partir de las clases java.&lt;br /&gt;
&lt;br /&gt;
{{curso|url=http://www.dosideas.com/cursos/course/view.php?id=10|nombre=Servicios Web con Spring-WS}}&lt;br /&gt;
&lt;br /&gt;
==Las principales características de SpringWS==&lt;br /&gt;
&lt;br /&gt;
Facilita aplicar las mejores practicas para la creación de servicios web&lt;br /&gt;
Facilidad para distribuir los pedidos xml a través de diferentes tipos de mapeos&lt;br /&gt;
Soporte para varias librerias de manejo de XML (DOM, SAX, StAX, JDOM, dom4j, XDOM)&lt;br /&gt;
Soporte para mapeo de xml a objetos ([[Castor]], JiBX, JAXB, XStream).&lt;br /&gt;
&lt;br /&gt;
== Interceptores ==&lt;br /&gt;
Si usamos ''org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping'' para hacer el binding de los endpoints podemos agregar varios interceptores. Solo hay que definirlos dentro de la lista de interceptores que tiene como opción la clase.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;!-- rooteo de los mensajes a cada uno de los endpoints --&amp;gt;&lt;br /&gt;
&amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;mappings&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;props&amp;gt;&lt;br /&gt;
            &amp;lt;!-- rooteo para el ejemplo de payload --&amp;gt;&lt;br /&gt;
            &amp;lt;prop key=&amp;quot;{http://dosideas.com/oc/schemas}OrdenDeCompraRequest&amp;quot;&amp;gt;ordenDeCompraMarshallingEndPoint&amp;lt;/prop&amp;gt;&lt;br /&gt;
            &amp;lt;!-- rooteo para el ejemplo de message --&amp;gt;&lt;br /&gt;
            &amp;lt;prop key=&amp;quot;{http://dosideas.com/oc/schemas}ConsultaPrecioRequest&amp;quot;&amp;gt;consultaPrecioMessageEndpoint&amp;lt;/prop&amp;gt;&lt;br /&gt;
        &amp;lt;/props&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;interceptors&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;list&amp;gt;&lt;br /&gt;
            &amp;lt;bean class=&amp;quot;org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;ref bean=&amp;quot;validatingInterceptor&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/list&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Interceptor de validaciones ===&lt;br /&gt;
El interceptor de validaciones es una herramienta muy útil, que nos permite verificar tanto el request como el response del web service. Verifica tanto el esquema de los xmls como las restricciones que tiene cada uno de los elementos de los xsd. Si alguna de las validaciones no se cumple devuelve un fault si es un request, y genera un warning en el log si es un response.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;validatingInterceptor&amp;quot;&lt;br /&gt;
    class=&amp;quot;org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;xsdSchemaCollection&amp;quot; ref=&amp;quot;schemaCollection&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;validateRequest&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;validateResponse&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Este bean hace referencia a los esquemas(.xsd) y al interpretarlos puede saber la estructura y restricciones de los request/response.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;schemaCollection&amp;quot;&lt;br /&gt;
    class=&amp;quot;org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;xsds&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;list&amp;gt;&lt;br /&gt;
            &amp;lt;value&amp;gt;/WEB-INF/contratoDeDatos.xsd&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/list&amp;gt;&lt;br /&gt;
    &amp;lt;/property&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;inline&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si el servicio tiene más de una operación, existirán varios xsd. Actualmente existe un error al querer ingresar más de un xsd(el interceptor ve solo el primero). Para salvar este error se aconseja generar un nuevo .xsd que incluya los definidos para cada operación.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contratoDeDatos.xsd agrupador:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;xsd:schema targetNamespace=&amp;quot;http://www.movistar.com.ar/ws/schema/cater&amp;quot;&lt;br /&gt;
elementFormDefault=&amp;quot;qualified&amp;quot;&lt;br /&gt;
xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;br /&gt;
xmlns=&amp;quot;http://www.movistar.com.ar/ws/schema/cater&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;xsd:include schemaLocation=&amp;quot;validarCentroEmisor.xsd&amp;quot;&amp;gt;&amp;lt;/xsd:include&amp;gt;&lt;br /&gt;
    &amp;lt;xsd:include schemaLocation=&amp;quot;agenteUsuario.xsd&amp;quot;&amp;gt;&amp;lt;/xsd:include&amp;gt;&lt;br /&gt;
    &amp;lt;xsd:include schemaLocation=&amp;quot;validarFactura.xsd&amp;quot;&amp;gt;&amp;lt;/xsd:include&amp;gt;&lt;br /&gt;
&amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[MTOM con Spring Web Services]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [http://www.dosideas.com/cursos/course/view.php?id=10 Curso de Spring-WS de DosIdeas]&lt;br /&gt;
* [http://static.springsource.org/spring-ws/sites/1.5/ Web oficial de Spring-WS]&lt;br /&gt;
&lt;br /&gt;
[[Category:Spring Framework]]&lt;br /&gt;
[[Category:Web Service]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=SoapUI_Con_JUnit&amp;diff=5077</id>
		<title>SoapUI Con JUnit</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=SoapUI_Con_JUnit&amp;diff=5077"/>
				<updated>2010-06-24T13:09:47Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es muy fácil incorporar la suite de test [[JUnit]] generada por [[SoapUI]] a nuestro proyecto y poder así sumar estos test a los test de integración de nuestra aplicación. &lt;br /&gt;
&lt;br /&gt;
Librerias a incluir en el modulo de test de nuestro proyecto: &lt;br /&gt;
&lt;br /&gt;
*bcprov-jdk15-138.jar &lt;br /&gt;
*commons-beanutils.jar &lt;br /&gt;
*commons-cli.jar &lt;br /&gt;
*commons-codec.jar &lt;br /&gt;
*commons-httpclient.jar &lt;br /&gt;
*not-yet-commons-ssl.jar &lt;br /&gt;
*soapui.jar &lt;br /&gt;
*soapui-xmlbeans.jar &lt;br /&gt;
*soap-xmlbeans.jar &lt;br /&gt;
*xbean-fixed.jar &lt;br /&gt;
*xmlpublic.jar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; De esta manera corremos la batería completa de test de un proyecto. Hay que tener en cuenta que al tener un solo test para toda la batería, cuando surge un error no se continúa con el resto de los test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundo() throws Exception &lt;br /&gt;
{&lt;br /&gt;
	SoapUITestCaseRunner runner = new SoapUITestCaseRunner(); &lt;br /&gt;
	runner.setProjectFile( &amp;quot;src/dist/HolaMundo-soapui-project.xml&amp;quot; );&lt;br /&gt;
	runner.run(); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
También existe la posibilidad de correr individualmente cada uno de los test. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WsdlProject wsdlProject = null;&lt;br /&gt;
TestSuite testSuite = null;&lt;br /&gt;
&lt;br /&gt;
@Before&lt;br /&gt;
public void setUp() throws Exception {&lt;br /&gt;
&lt;br /&gt;
        wsdlProject = new WsdlProject(&amp;quot;src/dist/HolaMundo-soapui-project.xml&amp;quot;);&lt;br /&gt;
        testSuite = wsdlProject.getTestSuiteByName(&amp;quot;HolaMundo&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundoOk() {&lt;br /&gt;
&lt;br /&gt;
        TestCase testCase = testSuite.getTestCaseByName(&amp;quot;HolaMundoOk&amp;quot;);&lt;br /&gt;
        TestRunner runner = testCase.run(new PropertiesMap(), false);&lt;br /&gt;
        assertEquals(Status.FINISHED, runner.getStatus());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void holaMundoError() {&lt;br /&gt;
&lt;br /&gt;
        TestCase testCase = testSuite.getTestCaseByName(&amp;quot;HolaMundoError&amp;quot;);&lt;br /&gt;
        TestRunner runner = testCase.run(new PropertiesMap(), false);&lt;br /&gt;
        assertEquals(Status.FINISHED, runner.getStatus());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Problemas con Assertions ==&lt;br /&gt;
&lt;br /&gt;
No todas las &amp;quot;Assertions&amp;quot; disponibles en SoapUI funcionan desde JUnit. Por ejemplo las assertions &amp;quot;SOAP Reponse&amp;quot;, &amp;quot;Schema Compilance&amp;quot; y &amp;quot;SOAP Fault&amp;quot;. Cuando un TestCase tiene estas assertions, la corrida devuelve un estado FAILED.&lt;br /&gt;
&lt;br /&gt;
== Ver también  ==&lt;br /&gt;
&lt;br /&gt;
*[[Mock_de_un_web_service_con_Jetty|Alternativa a SoapUI utilizando Jetty]]&lt;br /&gt;
*[http://www.soapui.org/userguide/commandline/functional.html SoapUITestCaseRunner ]&lt;br /&gt;
&lt;br /&gt;
[[Category:Web_Service]] [[Category:JUnit]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium&amp;diff=3629</id>
		<title>Selenium</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium&amp;diff=3629"/>
				<updated>2009-11-02T20:09:56Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta de [[Software Libre]] para pruebas de aplicaciones Web. Las pruebas de [[Selenium]] se ejecutan directamente en un navegador y facilitan las pruebas de compatibilidad en navegadores, también como pruebas funcionales de aceptación de aplicaciones Web.&lt;br /&gt;
&lt;br /&gt;
La herramienta [[Selenium]] posee un ambiente de desarrollo llamado [[Selenium]] IDE, este facilita el registro de pruebas de aceptación y su depuración.&lt;br /&gt;
&lt;br /&gt;
==Integracion con JUnit 4.x==&lt;br /&gt;
&lt;br /&gt;
Para poder armar el test es necesario incluir los siguientes jars.&lt;br /&gt;
&lt;br /&gt;
*selenium-java-client-driver-tests.jar&lt;br /&gt;
*selenium-java-client-driver.jar&lt;br /&gt;
*selenium-server-tests.jar&lt;br /&gt;
*selenium-server.jar&lt;br /&gt;
&lt;br /&gt;
Se pueden descargar de acá: [http://archiva.openqa.org/repository/releases/org/openqa/selenium/selenium-remote-control/1.0-beta-1/selenium-remote-control-1.0-beta-1-dist.zip Librerías]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
import org.junit.Before;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import org.openqa.selenium.server.SeleniumServer;&lt;br /&gt;
&lt;br /&gt;
import com.thoughtworks.selenium.DefaultSelenium;&lt;br /&gt;
import com.thoughtworks.selenium.SeleneseTestCase;&lt;br /&gt;
&lt;br /&gt;
public class GoogleWebTest extends SeleneseTestCase {&lt;br /&gt;
&lt;br /&gt;
    private DefaultSelenium selenium;&lt;br /&gt;
    private SeleniumServer seleniumServer;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    @Before&lt;br /&gt;
    public void setUp(String browser) throws Exception {&lt;br /&gt;
        // Se instancia el server de selenium por default toma el puerto 4444&lt;br /&gt;
        seleniumServer = new SeleniumServer();&lt;br /&gt;
        seleniumServer.start();&lt;br /&gt;
&lt;br /&gt;
        // Se configura el acceso a la pagina por medio del server de selenium&lt;br /&gt;
        // DefaultSelenium(&amp;quot;SELENIUM_HOST&amp;quot;, PUERTO, &amp;quot;BROWSER&amp;quot;, URL_DE_LA_APLICACION);&lt;br /&gt;
        // En este ejemplo, se utiliza Internet Explorer: &amp;quot;*iehta&amp;quot;&lt;br /&gt;
        selenium = new DefaultSelenium(&amp;quot;localhost&amp;quot;, 4444, &amp;quot;*iehta&amp;quot;, &amp;quot;http://www.google.com&amp;quot;);&lt;br /&gt;
        selenium.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** Al finalizar los tests, detener el server de Selenium &lt;br /&gt;
      */&lt;br /&gt;
    @Override&lt;br /&gt;
    public void tearDown() throws Exception {&lt;br /&gt;
        // Se para la conexión con la pagina &lt;br /&gt;
        selenium.stop();&lt;br /&gt;
&lt;br /&gt;
        // Se para la instancia del server de selenium&lt;br /&gt;
        seleniumServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /** Testeamos una búsqueda en Google&lt;br /&gt;
      * Accedemos a Google, realizamos una búsqueda y comprobamos que venga el resultado esperado&lt;br /&gt;
      */&lt;br /&gt;
    @Test&lt;br /&gt;
    public void testGoogle() throws Exception {&lt;br /&gt;
        selenium.open(&amp;quot;http://www.google.com/webhp&amp;quot;);&lt;br /&gt;
        assertEquals(&amp;quot;Google&amp;quot;, selenium.getTitle());&lt;br /&gt;
        selenium.type(&amp;quot;q&amp;quot;, &amp;quot;Selenium OpenQA&amp;quot;);&lt;br /&gt;
        assertEquals(&amp;quot;Selenium OpenQA&amp;quot;, selenium.getValue(&amp;quot;q&amp;quot;));&lt;br /&gt;
        selenium.click(&amp;quot;btnG&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(&amp;quot;30000&amp;quot;);&lt;br /&gt;
        assertEquals(&amp;quot;Selenium OpenQA - Google Search&amp;quot;, selenium.getTitle());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sobre waitForPageToLoad==&lt;br /&gt;
&lt;br /&gt;
Es importante que la página esté cargada antes de hacer las verificaciones sobre el nuevo contenido. Para hacer más sólido el caso de prueba ubica un waitForPageToLoad luego de un click.&lt;br /&gt;
&lt;br /&gt;
Es recomendable que al terminar un caso de prueba ubiques un waitForPageToLoad y así te aseguras que el próximo caso de prueba no falle al comenzar.&lt;br /&gt;
&lt;br /&gt;
==Sobre assertTextNotPresent==&lt;br /&gt;
&lt;br /&gt;
Este comando es útil después de cada comando clickAndWait para confirmar un texto no debe estar presente en la página.&lt;br /&gt;
&lt;br /&gt;
==Sobre assertTextPresent==&lt;br /&gt;
&lt;br /&gt;
Este comando es útil después de cada comando clickAndWait para confirmar un texto debe estar presente en la página.&lt;br /&gt;
&lt;br /&gt;
== Sobre Popups  ==&lt;br /&gt;
&lt;br /&gt;
En Selenium, se trabaja con una ventana a la vez. Para trabajar con diferentes ventanas (por ejemplo, un popup) se necesita primero elegir la ventana en cuestión. Y no solo basta con esto, tambien dicha ventana tiene que ser identificada. La forma mas facil de realizar esto es capturar el id de la nueva ventana con Selenium IDE. &lt;br /&gt;
&lt;br /&gt;
Si la ventana se abre con un target=&amp;quot;_blank&amp;quot; no se podrá utilizar Selenium para acceder a dicha ventana dado a que el id que se genera es random. Hay un [http://jira.openqa.org/browse/SEL-203 Jira] abierto en Selenium para resolver esto.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
*[[Herramientas Para Pruebas De Aceptacion]]&lt;br /&gt;
*[http://selenium.openqa.org/ Web oficial de Selenium]&lt;br /&gt;
*[http://www.pghcodingdojo.org/index.php/Selenium_RC_Tutorial Selenium RC Tutorial]&lt;br /&gt;
*[http://www.dosideas.com/java/743-test-secuencial-con-selenium-y-junit.html Test Secuancial con Selenium y JUnit]&lt;br /&gt;
*[http://wiki.openqa.org/display/SEL/Selenium+Core+FAQ#SeleniumCoreFAQ-HowdoIworkwithapopupwindow%3F Popup con Selenium]&lt;br /&gt;
&lt;br /&gt;
[[Category:ATDD]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Selenium&amp;diff=3628</id>
		<title>Selenium</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Selenium&amp;diff=3628"/>
				<updated>2009-11-02T20:07:18Z</updated>
		
		<summary type="html">&lt;p&gt;Uva: /* Sobre Popups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Selenium]] es una herramienta de [[Software Libre]] para pruebas de aplicaciones Web. Las pruebas de [[Selenium]] se ejecutan directamente en un navegador y facilitan las pruebas de compatibilidad en navegadores, también como pruebas funcionales de aceptación de aplicaciones Web.&lt;br /&gt;
&lt;br /&gt;
La herramienta [[Selenium]] posee un ambiente de desarrollo llamado [[Selenium]] IDE, este facilita el registro de pruebas de aceptación y su depuración.&lt;br /&gt;
&lt;br /&gt;
==Integracion con JUnit 4.x==&lt;br /&gt;
&lt;br /&gt;
Para poder armar el test es necesario incluir los siguientes jars.&lt;br /&gt;
&lt;br /&gt;
*selenium-java-client-driver-tests.jar&lt;br /&gt;
*selenium-java-client-driver.jar&lt;br /&gt;
*selenium-server-tests.jar&lt;br /&gt;
*selenium-server.jar&lt;br /&gt;
&lt;br /&gt;
Se pueden descargar de acá: [http://archiva.openqa.org/repository/releases/org/openqa/selenium/selenium-remote-control/1.0-beta-1/selenium-remote-control-1.0-beta-1-dist.zip Librerías]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
import org.junit.Before;&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
import org.openqa.selenium.server.SeleniumServer;&lt;br /&gt;
&lt;br /&gt;
import com.thoughtworks.selenium.DefaultSelenium;&lt;br /&gt;
import com.thoughtworks.selenium.SeleneseTestCase;&lt;br /&gt;
&lt;br /&gt;
public class GoogleWebTest extends SeleneseTestCase {&lt;br /&gt;
&lt;br /&gt;
    private DefaultSelenium selenium;&lt;br /&gt;
    private SeleniumServer seleniumServer;&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    @Before&lt;br /&gt;
    public void setUp(String browser) throws Exception {&lt;br /&gt;
        // Se instancia el server de selenium por default toma el puerto 4444&lt;br /&gt;
        seleniumServer = new SeleniumServer();&lt;br /&gt;
        seleniumServer.start();&lt;br /&gt;
&lt;br /&gt;
        // Se configura el acceso a la pagina por medio del server de selenium&lt;br /&gt;
        // DefaultSelenium(&amp;quot;SELENIUM_HOST&amp;quot;, PUERTO, &amp;quot;BROWSER&amp;quot;, URL_DE_LA_APLICACION);&lt;br /&gt;
        // En este ejemplo, se utiliza Internet Explorer: &amp;quot;*iehta&amp;quot;&lt;br /&gt;
        selenium = new DefaultSelenium(&amp;quot;localhost&amp;quot;, 4444, &amp;quot;*iehta&amp;quot;, &amp;quot;http://www.google.com&amp;quot;);&lt;br /&gt;
        selenium.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** Al finalizar los tests, detener el server de Selenium &lt;br /&gt;
      */&lt;br /&gt;
    @Override&lt;br /&gt;
    public void tearDown() throws Exception {&lt;br /&gt;
        // Se para la conexión con la pagina &lt;br /&gt;
        selenium.stop();&lt;br /&gt;
&lt;br /&gt;
        // Se para la instancia del server de selenium&lt;br /&gt;
        seleniumServer.stop();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /** Testeamos una búsqueda en Google&lt;br /&gt;
      * Accedemos a Google, realizamos una búsqueda y comprobamos que venga el resultado esperado&lt;br /&gt;
      */&lt;br /&gt;
    @Test&lt;br /&gt;
    public void testGoogle() throws Exception {&lt;br /&gt;
        selenium.open(&amp;quot;http://www.google.com/webhp&amp;quot;);&lt;br /&gt;
        assertEquals(&amp;quot;Google&amp;quot;, selenium.getTitle());&lt;br /&gt;
        selenium.type(&amp;quot;q&amp;quot;, &amp;quot;Selenium OpenQA&amp;quot;);&lt;br /&gt;
        assertEquals(&amp;quot;Selenium OpenQA&amp;quot;, selenium.getValue(&amp;quot;q&amp;quot;));&lt;br /&gt;
        selenium.click(&amp;quot;btnG&amp;quot;);&lt;br /&gt;
        selenium.waitForPageToLoad(&amp;quot;30000&amp;quot;);&lt;br /&gt;
        assertEquals(&amp;quot;Selenium OpenQA - Google Search&amp;quot;, selenium.getTitle());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sobre waitForPageToLoad==&lt;br /&gt;
&lt;br /&gt;
Es importante que la página esté cargada antes de hacer las verificaciones sobre el nuevo contenido. Para hacer más sólido el caso de prueba ubica un waitForPageToLoad luego de un click.&lt;br /&gt;
&lt;br /&gt;
Es recomendable que al terminar un caso de prueba ubiques un waitForPageToLoad y así te aseguras que el próximo caso de prueba no falle al comenzar.&lt;br /&gt;
&lt;br /&gt;
==Sobre assertTextNotPresent==&lt;br /&gt;
&lt;br /&gt;
Este comando es útil después de cada comando clickAndWait para confirmar un texto no debe estar presente en la página.&lt;br /&gt;
&lt;br /&gt;
==Sobre assertTextPresent==&lt;br /&gt;
&lt;br /&gt;
Este comando es útil después de cada comando clickAndWait para confirmar un texto debe estar presente en la página.&lt;br /&gt;
&lt;br /&gt;
== Sobre Popups ==&lt;br /&gt;
&lt;br /&gt;
En Selenium, se trabaja con una ventana a la vez. Para trabajar con diferentes ventanas (por ejemplo, un popup) se necesita primero elegir la ventana en cuestión. Y no solo basta con esto, tambien dicha ventana tiene que ser identificada. La forma mas facil de realizar esto es capturar el id de la nueva ventana con Selenium IDE. &lt;br /&gt;
&lt;br /&gt;
Si la ventana se abre con un target=&amp;quot;_blank&amp;quot; no se podrá utilizar Selenium para acceder a dicha ventana.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
*[[Herramientas Para Pruebas De Aceptacion]]&lt;br /&gt;
*[http://selenium.openqa.org/ Web oficial de Selenium]&lt;br /&gt;
*[http://www.pghcodingdojo.org/index.php/Selenium_RC_Tutorial Selenium RC Tutorial]&lt;br /&gt;
*[http://www.dosideas.com/java/743-test-secuencial-con-selenium-y-junit.html Test Secuancial con Selenium y JUnit]&lt;br /&gt;
*[http://wiki.openqa.org/display/SEL/Selenium+Core+FAQ#SeleniumCoreFAQ-HowdoIworkwithapopupwindow%3F Popup con Selenium]&lt;br /&gt;
&lt;br /&gt;
[[Category:ATDD]]&lt;/div&gt;</summary>
		<author><name>Uva</name></author>	</entry>

	</feed>