blog de OscarRyz

Probar una cadena de llamadas con Mockito

Como @neodevelop explica en esta entrada: http://www.javamexico.org/blogs/neodevelop/pruebas_de_unidad_con_mockito... se puede probar con Mockito si un metodo fue llamado o no utilizando verify(objeto).nombreDelMetodo();

Utilice varias veces esa comprobación hasta que me fallo recientemente en un escenario como el siguiente: quería ver si mi nuevo método PhoneManager.getPhone(id) estaba invocando el método Profile.getPhone()

// FAIL
// prueba que el getter getPhone fue invocado:
class PhoneManagerTest {
    @InjectMocks PhoneManager phoneManager;
    @Mock Profile profile;
    ...
    @Test
    public void testGetPhone() {
        Assert.assertEquals("(55) 5658-1111", phoneManager.getContactPhone(1));
        Mockito.verify(profile).getPhone();
    }

El problema es que profile no es un atributo de PhoneManager sino que es obtenido con una cadena de llamadas como esta:

Profile profile = phoneManager.getAccountAdapter().getProfileService().getProfileById(id);

Ejemplo de aplicacion web + cliente usando Spring MVC y HttpComponents

Estaba escribiendo en una respuesta aquí en Java México como usar algún framework para hacer una aplicación cliente / servidor usando JSON como formato de transporte y HTTP como protocolo.

Según yo era así de fácil

Ajaaa si, mira usa Spring MVC y HttpClient; aqui esta Google ...

Pero sinceramente jamás he hecho precisamente ese ejercicio y como hacía tiempo que quería hacerlo y andaba insomne hice esto.

https://github.com/OscarRyz/webapp-demo

//-- App.java
public class App  {
    public static void main( String[] args ) throws Exception {
        Loteria  loteria =  new Loteria();
        Ticket t = loteria.ganador();
        System.out.println( t );
    }
}

// Cliente -- Loteria.java
public class Loteria {
   public String path(String path) {
      return "http://localhost:8080/loteria/"+ path;
   }
   
   public Ticket ganador() throws Exception {
      DefaultHttpClient httpclient = new DefaultHttpClient();
      HttpResponse response = httpclient.execute(new HttpGet(path("/ganador")));
      ObjectMapper mapper = new ObjectMapper();

Nightcode

Encontré este editor escrito en clojure que me pareció muy interesante.

El código esta en Github y el sitio es:

http://nightcode.info/

Por si les interesa.

Chau!

<code></code>

Utiliza <code></code> al escribir codigo en el sitio

Asi esto:

Se ve asi:

public class Ejemplo {
    public static void main( String ... args ) {
        for ( String n : args ) {
            System.out.printf("Hola %s%n", n );
        }
    }
}

Ejemplo de un equipo de fútbol

Pongo esto aquí por si a alguien le sirve.

import java.util.Scanner;

class Equipo {
    private String nombre;
    private int juegosJugados;
    private int juegosGanados;
    private int juegosEmpatados;
    private int juegosPerdidos;
    private int golesFavor;
    private int golesEnContra;

    public int calcularPuntos() {
        return juegosJugados * 3 + juegosEmpatados;
    }
    public int calcularBono() {
        return calcularPuntos() * 100
        + golesFavor * 500
        - juegosPerdidos * 500
        + (juegosJugados % 2 == 0 ? 5000 : 0);
    }
    public String toString()  {
        return String.format("Nombre: %-20s, Bono: %-10d, Puntos: %-10d", nombre, calcularBono(), calcularPuntos());
    }
    public static Equipo creaEquipo( String nombre, int jj, int jg, int je, int jp, int gf, int ge ) {
        Equipo e          = new Equipo();
        e.nombre          = nombre;
        e.juegosJugados   = jj;
        e.juegosGanados   = jg;
        e.juegosEmpatados = je;
        e.juegosPerdidos  = jp;
        e.golesFavor      = gf;
        e.golesEnContra   = ge;
        return e;
    }

}

Todo sobre Java 8

Este post es del mes pasado y habia olvidado comentarlo aca

http://www.techempower.com/blog/2013/03/26/everything-about-java-8/

En resumen, algunas de las cosas nuevas que tiene Java 8 estan:

- Closures finalmente
- Implementacion por default en ias interfaces
- Interfaces funcionales
- Mejora (leve) en la inferencia en tipos genericos
- Java Time (ya era tiempo... juar juar, entienden Tiempo? ash...)
- Un monton de cambios en las bibliotecas para tomar ventajas de los closures.

Día de Ryz, 2013

El año que acaba de concluir fue bastante lento para Ryz, la razón es que me pasaron muchas cosas.

- Cambié de trabajo para entrar a Knowtion y esto me absorbió la mayor parte de mi tiempo libre.
- La otra gran parte de mi tiempo libre me la pesé haciendo otras cosas que me hacían mucho, mucho, pero muucho muy feliz.

Estuvo bien, no hay queja. El objetivo de Ryz no es competir contra los otros lenguajes, ni siquiera contra Java mismo, no hay prisa.

En el 2012 lenguajes existentes y nuevos han ido consolidando algo que pretende hacer Ryz, simplificar el uso de Java. Java 8 incluirá closures finalmente, IDE's como Intellj IDEA 12 ya tienen soporte para ello. La comunidad (al menos en la que me encuentro) tiene ya bastante familiaridad con el uso de bloques y la programación funcional está empezando a consolidarse como paradigma al lado de la POO. Hay al menos un lenguaje con tipado estructurado que está siendo usado con éxito en producción actualmente. Todos hablan ya de Smalltalk y así por el estilo. Mucho e esto estaba en la base de Ryz, mucho solo en mi cabeza.

Loop recognition in C++/Java/Go/Scala

Encontré esta comparación de lenguajes que me parece interesante compartir.

http://research.google.com/pubs/pub37122.html

No estoy muy acostumbrado a leer este tipo de documentos, pero encuentro bastante entretenido aunque sea solo ojearlo y ver los dibujitos.

Una cosa que encuentro es que en Scala se puede escribir con mucho menos código, pero que esa brevedad se transmite muchas veces al tiempo de ejecución, es decir debes de verdad saber que estás escribiendo y que impacto tiene ahorrarse algunas lineas de código, claro ejemplo los for-comprehensions que Ezamudio ya explicó por acá anteriormente.

Voy a seguir viendo las figuritas, se ve bastante interesante.

Les dejo la conclusión (ya todos saben que no hay que hacer caso a estas conclusiones verdad? bien)


Hemos implementado un algoritmo compacto bien especificado
en cuatro lenguajes, C++, Java, Go y Scala, y evaluado los resultados
en varias dimensiones, encontrando factores de diferencia en todas las
areas. Hemos discutido varias optimizaciones subsecuentes especificas
a cada lenguaje que nos indican puntos débiles comunes en el desempeño
de cada lenguaje
.

El garbage collector y los memory leaks

Antecedente

Una de los aportes más relevantes de Java es la inclusión del recolector de basura ( garbage collector) tanto que hoy en día es un estándar y ni se menciona como una característica del lenguaje. Java no lo inventó, pero si aportó mucho para su adopción.

El GC corre automáticamente en la JVM cada cierto tiempo. No hay forma de proveer cuando lo hará (o si lo hará) ni de forzar a que corra (o que no lo haga). Existen varias estrategias de implementación y es todo un tema que sigue en desarrollo e investigación. Lo mejor de todo es que como usuarios de la plataforma tenemos muy poco que hacer para utilizarlo.

Referencias

La regla para que un objeto pueda ser recolectado es sencilla, no debe de haber referencias al objeto.

....
Empleado a = new Empleado("God"); // a es la 1ra referencia
Empleado b = a; // b es la segunda referencia al mismo objeto "God"
...

En el ejemplo anterior se creó un objeto de tipo Empleado y hay dos referencias a él (a y b). Este objeto no será recolectado por el gc y su memoria seguirá en uso.

Cuando ya no hay referencias al objeto:
 

Convenciones de escritura en Java

Siguiendo un comentario de Jose Manuel escribo acá un poco sobre las convenciones para escribir código Java, en particular sobre las llaves que van en la misma línea.

Más que obsesión es para tener consistencia en el uso del lenguaje.

El compilador no lo manda como advertencia ni nada. Es más bien para los que leen el código.

Más importante aún es tener consistencia con el equipo de trabajo. Si todo el equipo elije poner las llaves en la columna 80 esa es la convención en ese proyecto

import java.net.*                                         ;
import java.io.*                                          ;
import java.util.*                                        ;
public class Server                                       {
    public static void main( String[] args)               {
        try                                               {
            ServerSocket sock = new ServerSocket(4712,100);
            while(true) new Handler(sock.accept()).start();}
        catch(IOException e) {System.err.println(e);}     ;}}
Distribuir contenido