Al usar Mokito, ¿cuál es la diferencia entre el objeto real y el objeto burlado?

En el progtwig a continuación, estoy tratando de usar mockito con junit en mi caso de prueba. Pero no veo cómo Mokito está ayudando a crear objetos para mi prueba. No veo nada especial aquí, ya que parece como si mokito estuviera creando una instancia del objeto en realidad.

public class TestCase1{ @Mock MyClass myClass; public void setup(){ MokitoAnnotations.initMoks(this); } @Test public void testAddition(){ when(myClass.add(2,2)).thenReturn(20); assertEquals(4,myClass.add(2,2)); } } 

Mi clase real ( MyClass.java )

  public class MyClass{ public int add(int x, int y){ return x+y; } } 

¿Se burla de un objeto, lo mismo que inyectar (DI) un objeto? ¡Aprecio tu ayuda!

Su prueba no prueba ninguno de su código. Prueba que Mockito funciona bien.

Cuando presento el concepto de burla, tomo este ejemplo: supongamos que construyes un detonador y quieres probarlo. Por supuesto, puedes usar el detonador con una bomba real y ver si todo el bloque explota cuando usas el detonador. Pero eso no es muy práctico. Por cierto, tal vez ni siquiera tengas una bomba a tu disposición. Tal vez tu colega todavía lo está construyendo.

Entonces usas una bomba falsa. Tenga en cuenta el punto importante: para probar el detonador, utiliza una bomba falsa. No es un detonador simulado. Lo que se burla es la dependencia de la clase bajo prueba. No es la clase bajo prueba en sí.

¿Qué es una bomba falsa? Es solo una bomba falsa que no hace nada. Todo lo que hace es permitir verificar si se ha pedido que explote o no. Entonces su código para probar el detonador sería así:

 // create a mock bomb: Bomb mockBomb = mock(Bomb.class); // create a real detonator, but tie it to the mock bomb: Detonator detonator = new Detonator(mockBomb); // test the detonator. Since it's tied to a mock bomb, the block // won't explode detonator.pressTheRedButton(); // check it the mock bomb has been asked to explode, as it should // if the detonator works correctly verify(mockBomb).explode(); 

Ahora, si la prueba pasa, sabrá que todos los circuitos internos que se usan en pressTheRedButton() funcionan bien y eventualmente le dice a la bomba que explote. Entonces, usted sabe que, cuando se usa con una bomba real, se le pedirá a la bomba real que explote también al presionar el botón rojo.

Ahora regresemos al mundo real: quiere probar un servicio, y este servicio usa un DAO que necesita una base de datos llena de datos para funcionar bien. Para probar su servicio, simplemente puede simular el DAO y verificar que funcione correctamente. El DAO simulado también se puede usar como un stub , es decir, un objeto que devuelve lo que le dice que devuelva en la prueba, en lugar de consultar realmente la base de datos. Eso es lo que estás haciendo en el código de tu pregunta: le estás diciendo a la instancia falsa de MyClass que, cuando se llama a add() con 2 y 2 como argumentos, debería devolver 4.

Esto hace que la prueba sea más fácil de configurar, más rápida de ejecutar e independiente del código real de la DAO, que no es lo que quiere probar en la prueba unitaria del servicio.