¿Cuál es la diferencia entre @Mocky @InjectMocksen el marco de Mockito?
java
unit-testing
mocking
mockito
usuario2249972
fuente
fuente

Respuestas:
@Mockcrea un simulacro.@InjectMockscrea una instancia de la clase e inyecta las simulaciones que se crean con las anotaciones@Mock(o@Spy) en esta instancia.Tenga en cuenta que debe usar
@RunWith(MockitoJUnitRunner.class)oMockito.initMocks(this)para inicializar estos simulacros e inyectarlos.fuente
Este es un código de muestra sobre cómo
@Mocky cómo@InjectMocksfunciona.Digamos que tenemos
GameyPlayerclase.Como puede ver, la
Gameclase necesitaPlayerrealizar unattack.Mockito se burlará de una clase de jugador y es el comportamiento utilizando
whenythenReturnmétodo. Por último, el uso de@InjectMocksMockito pondrá de quePlayerenGame.Tenga en cuenta que ni siquiera tiene que crear un
new Gameobjeto. Mockito lo inyectará por ti.También obtendremos el mismo comportamiento usando
@Spyanotaciones. Incluso si el nombre del atributo es diferente.Eso es porque Mockito verificará la
Type Signatureclase de Juego, que esPlayeryList<String>.fuente
En su clase de prueba, la clase probada debe ser anotada con
@InjectMocks. Esto le dice a Mockito en qué clase inyectar simulacros:A partir de ese momento, podemos especificar qué métodos u objetos específicos dentro de la clase, en este caso
SomeManager, serán sustituidos por simulacros:En este ejemplo,
SomeDependencydentro de laSomeManagerclase se burlarán.fuente
@MockLa anotación se burla del objeto en cuestión.@InjectMocksLa anotación permite inyectar en el objeto subyacente los diferentes (y relevantes) simulacros creados por@Mock.Ambos son complementarios.
fuente
@InjectMockspara construir esta clase y espiarla también.Por ejemplo
Aquí necesitamos la clase DAO para la clase de servicio. Entonces, nos burlamos de él y lo inyectamos en la instancia de la clase de servicio. De manera similar, en Spring Framework todos los beans @Autowired pueden ser burlados por @Mock en jUnits e inyectados en su bean a través de @InjectMocks.
MockitoAnnotations.initMocks(this)El método inicializa estos simulacros y los inyecta para cada método de prueba, por lo que debe invocarse en elsetUp()método.Este enlace tiene un buen tutorial para el framework Mockito
fuente
Un "marco de simulación", en el que se basa Mockito, es un marco que le brinda la capacidad de crear objetos simulados (en términos antiguos, estos objetos podrían llamarse derivaciones, ya que funcionan como derivaciones para la funcionalidad dependiente) En otras palabras, una simulación El objeto se usa para imitar el objeto real del que depende su código; usted crea un objeto proxy con el marco de imitación. Al usar objetos simulados en sus pruebas, esencialmente pasará de las pruebas unitarias normales a las pruebas integrales
Mockito es un marco de prueba de código abierto para Java lanzado bajo la Licencia MIT, es un "marco de prueba", que le permite escribir hermosas pruebas con API limpia y simple. Hay muchos marcos de simulación diferentes en el espacio Java, sin embargo, existen esencialmente dos tipos principales de marcos de objeto simulados, los que se implementan a través de proxy y los que se implementan a través de la reasignación de clases.
Los marcos de inyección de dependencia como Spring le permiten inyectar sus objetos proxy sin modificar ningún código, el objeto simulado espera que se invoque un cierto método y devolverá un resultado esperado.
La
@InjectMocksanotación intenta crear una instancia de la instancia del objeto de prueba e inyecta campos anotados con@Mocko@Spyen campos privados del objeto de prueba.MockitoAnnotations.initMocks(this)llamar, restablece el objeto de prueba y reinicia los simulacros, así que recuerde tener esto en su@Before/@BeforeMethodanotación.fuente
Una ventaja que obtiene con el enfoque mencionado por @Tom es que no tiene que crear ningún constructor en SomeManager y, por lo tanto, limita a los clientes a crear una instancia.
Si es una buena práctica o no, depende del diseño de su aplicación.
fuente
Muchas personas han dado una gran explicación aquí sobre
@Mockvs@InjectMocks. Me gusta, pero creo que nuestras pruebas y aplicaciones deberían estar escritas de tal manera que no debamos usarlas@InjectMocks.Referencia para lecturas adicionales con ejemplos: https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/
fuente
@Mockse usa para declarar / burlarse de las referencias de los beans dependientes, mientras que@InjectMocksse usa para burlarse del bean para el que se está creando la prueba.Por ejemplo:
prueba para clase
A:fuente
La anotación @InjectMocks se puede usar para inyectar campos simulados en un objeto de prueba automáticamente.
En el ejemplo a continuación, @InjectMocks ha utilizado para inyectar el dataMap simulado en dataLibrary.
fuente
Tenga en cuenta que
@InjectMocksestán a punto de quedar en desusoy puedes seguir la respuesta y el enlace de @avp en:
fuente
Aunque las respuestas anteriores han cubierto, acabo de intentar agregar detalles minuciosos que veo que faltan. La razón detrás de ellos (The Why).
Ilustración:
Referencia
fuente