then prevent mock method injectmocks java testing mockito spy

java - prevent - mockito: ¿cómo desbloquear un método?



spy mockito (6)

Tengo una clase JUnit con diferentes métodos para realizar diferentes pruebas.

Utilizo Mockito para crear un espía en una instancia real, y luego anulo algún método que no es relevante para la prueba real que realizo.

¿Hay alguna manera, solo por el bien de limpiar después de mí en caso de que algunas otras pruebas que se ejecutan después de mis pruebas también utilicen las mismas instancias y podrían ejecutar un método burlado que no pidieron que se burlaran, para quitar la simulación de un método?

decir que tengo un objeto espía llamado ''wareHouseSpy''

dicen que he anulado el método isSomethingMissing :

doReturn(false).when(wareHouseSpy).isSomethingMissing()

¿Cuál será la forma correcta de anular, y devolver las cosas a la normalidad en el espía, es decir, hacer la siguiente invocación de isSomethingMissing para ejecutar el método real?

algo como

doReturn(Mockito.RETURN_REAL_METHOD).when(wareHouseSpy).isSomethingSpy()

o tal vez

Mockito.unmock(wareHouseSpy)

¿Quién sabe? No pude encontrar nada en esa área

¡Gracias!

Assaf


Depende de si está probando con TestNG o JUnit.

  • JUnit crea una nueva instancia de sí mismo para cada método de prueba. Básicamente, no tienes que preocuparte por reiniciar los simulacros.
  • Con TestNG, debe restablecer los simulacros con Mockito.reset(mockA, mockB, ...) en un @BeforeMothod o en un @AfterMethod

Digamos que la mayoría de tus pruebas usan la respuesta aplastada. Entonces tendrías un método setUp () que se ve así:

@Before public void setUp() { wareHouseSpy = spy(realWarehouse); doReturn(false).when(wareHouseSpy).isSomethingMissing(); }

Ahora digamos que desea deshacer la respuesta trozada y usar la implementación real en una prueba:

@Test public void isSomethingMissing_useRealImplementation() { // Setup when(wareHouseSpy.isSomethingMissing()).thenCallRealMethod(); // Test - Uses real implementation boolean result = wareHouseSpy.isSomethingMissing(); }


Dirigiendo esta pieza específicamente:

¿Hay alguna manera, solo por el bien de limpiar después de mí en caso de que algunas otras pruebas que se ejecutan después de mis pruebas también utilicen las mismas instancias y podrían ejecutar un método burlado que no pidieron que se burlaran, para quitar la simulación de un método?

Si está utilizando JUnit, la forma más limpia de hacer esto es usar @Before y @Before (otros frameworks tienen equivalentes) y recrear la instancia y el espía para que ninguna prueba dependa o se vea afectada por lo que haya hecho en cualquier otro prueba. Luego puede hacer la configuración específica de prueba del espía / simulacro dentro de cada prueba. Si por algún motivo no desea recrear el objeto, puede recrear el espía. De cualquier manera, todos comienzan con un nuevo espía cada vez.


La forma "normal" es volver a crear instancias en el método "setUp". Sin embargo, si tiene un objeto real que es caro de construir por alguna razón, podría hacer algo como esto:

public class MyTests { private static MyBigWarehouse realWarehouse = new MyBigWarehouse(); private MyBigWarehouse warehouseSpy; @Before public void setUp() { warehouseSpy = spy(realWarehouse); // same real object - brand new spy! doReturn(false).when(wareHouseSpy).isSomethingMissing(); } @Test ... @Test ... @Test ... }


Tal vez no estoy siguiendo, pero cuando tienes un objeto real :

Object mySpy = spy(real);

Luego, para " desactivar " mySpy ... solo use real .


creo

Mockito.reset(wareHouseSpy)

Lo haría.