¿Cuál es la diferencia entre @SpyBean de org.springframework.boot.test.mock.mockito.SpyBean y @Spy de org.mockito.Spy ?
Usar @SpyBean en lugar de @Spy hace que mis pruebas fallen.
@Spy dice :
Un campo anotado con @Spy se puede inicializar explícitamente en el punto de declaración. Alternativamente, si no proporciona la instancia, Mockito intentará encontrar un constructor de argumento cero (incluso privado) y crear una instancia para usted.
El doctor @SpyBean dice:
Anotación que se puede usar para aplicar espías de Mockito a un Spring ApplicationContext.
Todos los beans en el contexto del mismo tipo se envolverán con el espía. Si no se define ningún bean existente, se agregará uno nuevo.
Entonces, la principal diferencia es que @SpyBean es una anotación específica de Spring Boot, pero @Spy es parte de Mockito. @SpyBean y @Spy básicamente hacen lo mismo, pero @SpyBean puede resolver las dependencias específicas de Spring, por ejemplo, @Autowired , @Spy solo puede crear objetos con un constructor vacío.
Algo que noté durante las pruebas es que SpyBean puede dar como resultado que ciertos valores se transfieran entre pruebas, mientras que Spy siempre comienza desde cero. En mi caso, tenía @SpyBean configurado en una clase que inicialmente tenía componentes autocableados. Pero después de refactorizar la clase para eliminarlas, no cambié las clases de prueba y tuve una falla inesperada.
Class1 { boolean boo; myMethodA() { if (something) { boo=true; } } myMethodB() { if (boo) { doThis(); } else { doThat(); } } }Tanto Test1 como Test2 utilizaron @SpyBean Class1. Tanto Test1 como Test2 se ejecutaron correctamente de forma aislada, pero cuando se ejecutan como una suite, Test2 fallaría si se ejecutara después de Test1.
Test1 estableció un valor booleano en Class1 en verdadero, que seguía siendo verdadero cuando se ejecutó Test2. Esto hizo que Test2 fallara porque esperaba que el valor booleano fuera falso. Cambiar a @Spy Class1 resultó en que el booleano se restableciera a falso y ambas pruebas pasaran.