https://dosideas.com/wiki/api.php?action=feedcontributions&user=211.214.160.38&feedformat=atomDos Ideas. - Contribuciones del usuario [es]2024-03-29T06:02:47ZContribuciones del usuarioMediaWiki 1.28.2https://dosideas.com/wiki/index.php?title=Mockito&diff=6168Mockito2011-09-06T09:56:13Z<p>211.214.160.38: /* Ejemplos de Mockito junto a PowerMock */</p>
<hr />
<div>Mockito es una librería [[Java]] para la creación de [[Mock Object]] muy usados para el testeo unitario en [[Test Driven Development]], basado en [[EasyMock]]. <br />
<br />
Mockito fue creado con el objetivo de simplificar y solucionar algunos de los temas antes mencionados. EasyMock y Mockito puede hacer exactamente las mismas cosas, pero Mockito tiene un API más natural y práctico de usar.<br />
<br />
==Características principales==<br />
# Se pueden crear mocks de interfaces y clases concretas.<br />
# Verificación de invocaciones (cantidad exacta, al menos una vez, órden de invocación, etc.)<br />
# El stack trace se mantiene limpio, ya que los errores ocurren en los assert que se hagan (y no dentro del método bajo prueba, como en EasyMock).<br />
# Un API más clara para crear stubs y verificaciones<br />
<br />
==Ejemplo de uso==<br />
<code java><br />
import static org.mockito.Mockito.*;<br />
.....<br />
//creamos el mock y el stub<br />
ArrayList instance = mock(ArrayList.class);<br />
doReturn("hola mundo").when(instance).get(0);<br />
<br />
//ejecutamos la lógica a probar<br />
instance.get(0); <br />
<br />
//verificamos que se hayan invocado los métodos<br />
verify(instance).get(0);<br />
</code><br />
<br />
==Más de una invocación a un mismo método==<br />
<br />
Algunas veces necesitamos que un método retorne un valor y que en la segunda invocación retorne nulo o una excepción. Para eso, anidamos los retornos:<br />
<br />
<code html4strict><br />
<br />
//Retornos para las 2 invocaciones<br />
doReturn("algo").doReturn(null).when(instance).scrollNext();<br />
<br />
//ejecutamos la lógica a probar<br />
instance.unMetodoQueUsaScroll(); <br />
<br />
//verificamos que se haya invocado el mismo método dos veces<br />
verify(instance, times(2)).scrollNext();<br />
<br />
</code><br />
<br />
* [http://mockito.googlecode.com/svn/branches/1.5/javadoc/org/mockito/Mockito.html Leer más en Mockito API]<br />
<br />
It's spooky how celevr some ppl are. Thanks!<br />
<br />
==Ejemplo de Mockito para mockear appender de log4j==<br />
<br />
<code java><br />
//Inicializamos mock.<br />
Appender mockAppender = mock(AppenderSkeleton.class);<br />
//Inicializamos logger de la clase bajo test<br />
Logger log = Logger.getLogger(ClaseATestear.class);<br />
//Agregamos el mock del appender al logger.<br />
log.addAppender(mockAppender);<br />
//Seteamos el nivel de log que nos interesa recuperar.<br />
log.setLevel(Level.DEBUG);<br />
</code><br />
<br />
Para poder obtener los log que se produjeron utilizamos la clase ArgumentCaptor de mockito que nos permite, entre otras cosas, capturar los eventos de log.<br />
<br />
<code java><br />
ArgumentCaptor loggingEventCaptor = ArgumentCaptor.forClass(LoggingEvent.class);<br />
<br />
loggingEventCaptor.capture());<br />
</code><br />
<br />
Una posible forma de obtener un mensaje particular es iterando la lista de mensajes que nos da la clase capturada.<br />
<br />
<code java><br />
List<LoggingEvent> loggingEvent = (List<LoggingEvent>) loggingEventCaptor.getAllValues();<br />
</code><br />
<br />
== BDDMockito ==<br />
BDDMokcito es una clase alternativa que ofrece [[Mockito]] para crear pruebas al estilo [[Behavior Driven Development]] (BDD) (es decir, con bloques dado / cuando / entonces). <br />
<br />
El problema es que el API de Mockito usa la palabra "when" y no se integra bien con los comentarios //given //when //then (según BDD, el stubbing forma parte del área //given, y no del //when). <br />
<br />
BDDMockito agrega una clase que tiene alias para los métodos de stub, usando given(Object). <br />
<br />
<code java5><br />
import static org.mockito.BDDMockito.*;<br />
<br />
Vendedor vendedor = mock(Vendedor.class);<br />
Negocio negocio = new Negocio(vendedor);<br />
<br />
@Test<br />
public void comprarPan() throws Exception {<br />
//given <br />
given(vendedor.buscarPan()).willReturn(new Pan());<br />
<br />
//when<br />
Compra compra = negocio.comprarPan();<br />
<br />
//then<br />
assertThat(compra, contienePan());<br />
} <br />
</code><br />
<br />
Stubbing con void y excepciones:<br />
<code java5><br />
//given<br />
willThrow(new RuntimeException("boo")).given(mock).foo();<br />
<br />
//when<br />
Result result = sistemaBajoPrueba.ejecutar();<br />
<br />
//then<br />
assertEquals(failure, result); <br />
</code><br />
<br />
==Ver también==<br />
* [[EasyMock]]<br />
* [[Captura De Parametros]]<br />
* [[Inyeccion De Mocks De Mockito Con Spring]]<br />
* [http://www.dosideas.com/descargas/category/3-testing.html?download=11%3Ademo-de-mockito Proyecto de ejemplos con Mockito]<br />
* [http://www.dosideas.com/java/242-mockito-o-basta-de-easymock.html Introducción a Mockito]<br />
* [http://mockito.googlecode.com/svn/branches/1.8.0/javadoc/org/mockito/BDDMockito.html Javadoc de BDDMockito]<br />
<br />
[[Category:TDD]]<br />
[[Category:BDD]]<br />
[[Category:JUnit]]</div>211.214.160.38