¿Cuál es el mejor marco para la creación de simulacros de objetos en Java? ¿Por qué? ¿Cuáles son los pros y los contras de cada marco?
Respuestas
¿Demasiados anuncios?He tenido buen éxito con Mockito.
Cuando traté de aprender acerca de JMock y EasyMock, me encontré con la curva de aprendizaje para ser un poco caro (aunque tal vez eso es sólo conmigo).
Me gusta Mockito, debido a su sencillo y limpio de la sintaxis de que yo era capaz de captar muy rápidamente. A la mínima que la sintaxis está diseñado para apoyar el común de los casos muy bien, aunque las pocas veces que yo necesitaba hacer algo más complicado que he encontrado lo que yo quería era compatible y fácil de entender.
He aquí un (abreviada) ejemplo de la Mockito página de inicio:
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
No se puede pedir mucho más sencillo que eso.
La única gran pega que puedo pensar es que no burlarse de métodos estáticos.
Yo soy el creador de PowerMock así que, obviamente, tengo que recomendar que! :-)
PowerMock se extiende tanto a EasyMock y Mockito con la capacidad para burlarse de los métodos estáticos, final e incluso los métodos privados. El EasyMock apoyo es completo, pero el Mockito plugin necesita algo más de trabajo. Estamos planeando agregar JMock apoyo.
PowerMock no pretende sustituir a otros marcos de referencia, sino que puede ser utilizado en las situaciones más difíciles cuando otros marcos no permite que se burlaba. PowerMock también contiene otras características útiles, tales como la supresión de los inicializadores estáticos y constructores.
El JMockit sitio del proyecto contiene un montón de información comparativa para la actual burlándose de kits de herramientas.
En particular, retirar la matriz de comparación de características, que cubre EasyMock/EasyMock CE, jMock, Mockito, Unitils Simulacro, PowerMock, y por supuesto JMockit. Trato de mantener dicha información precisa y actualizada, tanto como sea posible.
He tenido éxito con jmockit (ver https://java.net/projects/jmockit/)
Es bastante nuevo, así que es un poco cruda y underdocumented. Utiliza asm (http://asm.objectweb.org/index.html) dinámicamente redefinir la clase de código de bytes, por lo que puede burlarse de todos los métodos, incluyendo estática, privadas, constructores, y los 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 de las Expectativas de interface de grabación/reproducción de escenarios así:
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 de java 5/6.
Usted podría tener también un vistazo a la prueba con Groovy. En Groovy puede fácilmente burlarse de interfaces Java utilizando el " como " operador:
def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest
Aparte de esta funcionalidad básica Groovy ofrece mucho más en la burla frente, incluyendo el poderoso MockFor
y StubFor
clases.
http://docs.codehaus.org/display/GROOVY/Groovy+Mocks