Pregunta

¿Cuál es el mejor marco para crear objetos simulados en Java?¿Por qué?¿Cuáles son los pros y los contras de cada marco?

¿Fue útil?

Solución

He tenido buen éxito usando Mockito.

Cuando intenté aprender sobre JMock y EasyMock, encontré que la curva de aprendizaje era un poco pronunciada (aunque tal vez sea solo yo).

Me gusta Mockito por su sintaxis simple y limpia que pude comprender con bastante rapidez.La sintaxis mínima está diseñada para soportar muy bien los casos comunes, aunque las pocas veces que necesité hacer algo más complicado encontré que lo que quería era compatible y fácil de entender.

Aquí hay un ejemplo (abreviado) de la página de inicio de Mockito:

import static org.mockito.Mockito.*;

List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();

No hay nada más sencillo que eso.

El único inconveniente importante que se me ocurre es que no se burlará de los métodos estáticos.

Otros consejos

Soy el creador de PowerMock, ¡así que obviamente debo recomendarlo!:-)

PowerMock extiende tanto EasyMock como Mockito con la capacidad de métodos estáticos simulados, métodos finales e incluso privados.La compatibilidad con EasyMock está completa, pero el complemento Mockito necesita más trabajo.También estamos planeando agregar soporte para JMock.

PowerMock no pretende reemplazar otros marcos, sino que puede usarse en situaciones difíciles cuando otros marcos no permiten burlarse.PowerMock también contiene otras funciones útiles como suprimir inicializadores estáticos y constructores.

El Sitio del proyecto JMockit contiene mucha información comparativa de los kits de herramientas de burla actuales.

En particular, consulte el matriz de comparación de características, que cubre EasyMock, jMock, Mockito, Unitils Mock, PowerMock y, por supuesto, JMockit.Intento mantenerlo preciso y actualizado, tanto como sea posible.

He tenido éxito con JMockit.

Es bastante nuevo, por lo que está un poco crudo y poco documentado.Usa MAPE para redefinir dinámicamente el código de bytes de la clase, de modo que pueda simular todos los métodos, incluidos los estáticos, privados, constructores e inicializadores estáticos.Por ejemplo:

import mockit.Mockit;

...
Mockit.redefineMethods(MyClassWithStaticInit.class,
                       MyReplacementClass.class);
...
class MyReplacementClass {
  public void $init() {...} // replace default constructor
  public static void $clinit{...} // replace static initializer
  public static void myStatic{...} // replace static method
  // etc...
}

Tiene una interfaz de Expectativas que también permite escenarios de grabación/reproducción:

import mockit.Expectations;
import org.testng.annotations.Test;

public class ExpecationsTest {
  private MyClass obj;

  @Test
  public void testFoo() {
    new Expectations(true) {
      MyClass c;
      {
        obj = c;
        invokeReturning(c.getFoo("foo", false), "bas");
      }
    };

    assert "bas".equals(obj.getFoo("foo", false));

    Expectations.assertSatisfied();
  }

  public static class MyClass {
    public String getFoo(String str, boolean bool) {
      if (bool) {
        return "foo";
      } else {
        return "bar";
      }
    }
  }
}

La desventaja es que requiere Java 5/6.

También puedes echar un vistazo a las pruebas con Groovy.En Groovy puedes burlarte fácilmente de las interfaces Java usando el operador 'as':

def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest 

Aparte de esta funcionalidad básica, Groovy ofrece mucho más en el frente de burla, incluido el poderoso MockFor y StubFor clases.

http://docs.codehaus.org/display/GROOVY/Groovy+Mocks

Empecé a usar simulacros con Fácil Mock.Bastante fácil de entender, pero el paso de repetición fue un poco molesto. Mockito elimina esto, también tiene una sintaxis más limpia ya que parece que la legibilidad era uno de sus objetivos principales.No puedo enfatizar lo suficiente lo importante que es esto, ya que la mayoría de los desarrolladores dedicarán su tiempo a leer y mantener el código existente, no a crearlo.

Otra cosa buena es que las interfaces y las clases de implementación se manejan de la misma manera, a diferencia de EasyMock, donde aún es necesario recordar (y verificar) el uso de una extensión de clase EasyMock.

He echado un vistazo rápido a JMockit recientemente, y aunque la lista de características es bastante completa, creo que el precio de esto es la legibilidad del código resultante y tener que escribir más.

Para mí, Mockito da en el clavo, ya que es fácil de escribir y leer y se ocupa de la mayoría de las situaciones que requerirá la mayoría del código.Usando Mockito con PowerMock sería mi elección.

Una cosa a considerar es que la herramienta que elegiría si estuviera desarrollando solo o en un equipo pequeño y muy unido, podría no ser la mejor para una gran empresa con desarrolladores de diferentes niveles de habilidad.En este último caso sería necesario prestar más atención a la legibilidad, la facilidad de uso y la simplicidad.No tiene sentido obtener el marco burlón definitivo si mucha gente termina por no usarlo o no mantener las pruebas.

Estamos usando mucho Fácil Mock y EasyMock Class Extension en el trabajo y estamos muy contentos con él.Básicamente te brinda todo lo que necesitas.Eche un vistazo a la documentación, hay un ejemplo muy bueno que muestra todas las características de EasyMock.

Usé JMock temprano.Probé Mockito en mi último proyecto y me gustó.Más conciso, más limpio.PowerMock cubre todas las necesidades que están ausentes en Mockito, como burlarse de un código estático, burlarse de la creación de una instancia, burlarse de clases y métodos finales.Entonces tengo todo lo que necesito para realizar mi trabajo.

Me gusta JMock porque puedes establecer expectativas.Esto es totalmente diferente a verificar si se llamó a un método que se encuentra en algunas bibliotecas simuladas.Usando JMock puedes escribir expectativas muy sofisticadas.ver el simulacro trampa-trampa.

Sí, Mockito es un gran marco.Lo uso junto con cresta de jamón y guía de google para configurar mis pruebas.

La mejor solución para burlarse es hacer que la máquina haga todo el trabajo con pruebas automatizadas basadas en especificaciones.Para Java, consulte ScalaCheck y el reducción marco incluido en el Java funcional biblioteca.Con los marcos de prueba automatizados basados ​​en especificaciones, usted proporciona una especificación del método bajo prueba (una propiedad que debería ser verdadera) y el marco genera pruebas y objetos simulados automáticamente.

Por ejemplo, la siguiente propiedad prueba el método Math.sqrt para ver si la raíz cuadrada de cualquier número positivo n al cuadrado es igual a n.

val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }

Cuando usted llama propSqrt.check(), ScalaCheck genera cientos de números enteros y verifica su propiedad para cada uno, asegurándose también automáticamente de que los casos extremos estén bien cubiertos.

Aunque ScalaCheck está escrito en Scala y requiere el compilador Scala, es fácil probar el código Java con él.El marco Reductio en Java funcional es una implementación Java pura de los mismos conceptos.

Mockito también proporciona la opción de crear métodos, hacer coincidir argumentos (como anyInt() y anyString()), verificar el número de invocaciones (times(3), atLeastOnce(), never()), y más.

También descubrí que Mockito es simple y limpio.

Una cosa que no me gusta de Mockito es que tú no se pueden eliminar métodos estáticos.

Para algo un poco diferente, puedes usar JRuby y Moca que se combinan en JtestR para escribir pruebas para su código Java en Ruby expresivo y conciso.Hay algunos ejemplos burlones útiles con JtestR. aquí.Una ventaja de este enfoque es que burlarse de clases concretas es muy sencillo.

Comencé a usar simulacros a través de JMock, pero finalmente pasé a usar EasyMock.EasyMock era precisamente eso, más fácil, y proporcionaba una sintaxis que parecía más natural.No he cambiado desde entonces.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top