¿Cómo puedo usar la inyección con Mockito y JUnit 5?
En JUnit4 solo puedo usar la @RunWith(MockitoJUnitRunner.class)Anotación. ¿En JUnit5 no hay @RunWithanotación?
fuente
¿Cómo puedo usar la inyección con Mockito y JUnit 5?
En JUnit4 solo puedo usar la @RunWith(MockitoJUnitRunner.class)Anotación. ¿En JUnit5 no hay @RunWithanotación?
Hay diferentes formas de usar Mockito; las revisaré una por una.
Crear simulacros manualmente con Mockito::mocktrabajos independientemente de la versión de JUnit (o marco de prueba para el caso).
Usando la anotación @Mock y la llamada correspondiente a MockitoAnnotations::initMocks
para crear simulacros funciona independientemente de la versión de JUnit (o el marco de prueba para el caso, pero Java 9 podría interferir aquí, dependiendo de si el código de prueba termina en un módulo o no).
JUnit 5 tiene un modelo de extensión poderoso y Mockito publicó recientemente uno bajo el ID de grupo / artefacto org.mockito : mockito-junit-jupiter .
Puede aplicar la extensión agregando @ExtendWith(MockitoExtension.class)a la clase de prueba y anotando campos simulados con @Mock. De MockitoExtensionJavaDoc:
@ExtendWith(MockitoExtension.class)
public class ExampleTest {
@Mock
private List list;
@Test
public void shouldDoSomething() {
list.add(100);
}
}
La documentación de MockitoExtension describe otras formas de crear instancias de simulacros, por ejemplo, con inyección de constructor (si rpefer campos finales en clases de prueba).
JUnit 4 reglas y los corredores no funcionan en JUnit 5, por lo que el MockitoRuley el corredor Mockito no se pueden utilizar.
@Testnecesidades debe ser público o el "paquete privado" es suficientemente bueno?Utilice Mockito's
MockitoExtension. La extensión está contenida en un nuevo artefactomockito-junit-jupiter:Te permite escribir pruebas como lo harías con JUnit 4:
fuente
@ExtendWith(MockitoExtension.class)es equivalente@RunWith(MockitoJUnitRunner.class)al JUnit4Hay diferentes formas de hacerlo pero la forma más limpia y que además respeta la filosofía JUnit 5 es crear un
org.junit.jupiter.api.extension.Extensionpara Mockito.1) Crear simulacros manualmente hace perder el beneficio de verificaciones adicionales de Mockito para asegurarse de que utiliza correctamente el marco.
2) Llamar
MockitoAnnotations.initMocks(this)a todas las clases de prueba es un código de placa de caldera que podríamos evitar.Y hacer esta configuración en una clase abstracta tampoco es una buena solución.
Acopla todas las clases de prueba a una clase base.
Si luego necesita una nueva clase de prueba base por buenas razones, termina con una jerarquía de clases de 3 niveles. Por favor evítelo.
3) Test Rules es una especificidad de JUnit 4.
Ni siquiera pienses en eso.
Y el documentación es clara al respecto:
4) Test Runner no es realmente la forma de extender el marco JUnit 5.
JUnit 5 simplificó el infierno de los Runners de JUnit 4 al proporcionar un modelo de extensión para escribir pruebas gracias a JUnit 5 Extensions.
Ni siquiera pienses en eso.
Así que favorece el
org.junit.jupiter.api.extension.Extensioncamino.EDITAR: En realidad, Mockito incluye una extensión de júpiter:
mockito-junit-jupiterEntonces, muy simple de usar:
Aquí hay una adición a la excelente respuesta de Jonathan.
Al agregar como dependencia el
mockito-junit-jupiterartefacto, el uso de@ExtendWith(MockitoExtension.class)produjo la siguiente excepción a medida que se ejecuta la prueba:El problema es que
mockito-junit-jupiterdepende de dos bibliotecas independientes. Por ejemplo paramockito-junit-jupiter:2.19.0:El problema fue que usé
junit-jupiter-api:5.0.1.Entonces, como
junit-jupiter-apitodavía se mueve a menudo en términos de API, asegúrese de depender de la misma versión de lajunit-jupiter-apiquemockito-junit-jupiterdepende.fuente
mockito-junit-jupitersaca la versión adecuada dejunit-jupiter-api?mockito-junit-jupiter:2.19.0. Mientras que las versiones de JUnit Jupiter comienzan con5. mockito-junit-jupiter debería haber especificado en su identificador de artefacto las dos cosas (la versión de Mockito y la versión de JUnit Jupiter) para aclarar las cosas. Por ejemplo,mockito-junit-jupiter-5.1:2.19.0para transmitir que la biblioteca está diseñada para JUnit Jupiter 5.1.MockitoExtensionno parece existir en lamockito-coreversión 3.0.0.mockito-junit-jupiterTienes que usar la nueva
@ExtendWithanotación.Lamentablemente, aún no hay una extensión publicada. En github puedes ver una implementación beta para la extensión. como ejemplo de prueba de demostración .
fuente