Por fin luego de tanto luchar hemos hallado la contestación de esta preocupación que algunos de nuestros usuarios de nuestro sitio han presentado. Si deseas compartir algo más puedes compartir tu comentario.
Solución:
También me he preguntado cómo inyectar un simulacro a un espía.
El siguiente enfoque no trabajo:
@Spy
@InjectMocks
private MySpy spy;
Pero el comportamiento deseado se puede lograr mediante un enfoque “híbrido”, cuando se utilizan tanto la anotación como la burla manual. Lo siguiente funciona perfectamente:
@Mock
private NeedToBeMocked needToBeMocked;
@InjectMocks
private MySpy mySpy;
@InjectMocks
private SubjectUnderTest sut;
@BeforeMethod
public void setUp()
mySpy = Mockito.spy(new MySpy());
MockitoAnnotations.initMocks(this);
(SubjectUnderTest
aquí depende de MySpy
, y MySpy
a su vez depende de NeedToBeMocked
).
UPD: Personalmente, creo que si tienes que hacer esa magia con demasiada frecuencia, podría ser una señal de que algo anda mal con las dependencias entre tus clases y vale la pena realizar un poco de refactorización para mejorar tu código.
Mockito no puede realizar inyecciones tan complicadas ya que no es un marco de inyección. Por lo tanto, debe refactorizar su código para hacerlo más comprobable. Es fácil de hacer usando la inyección del constructor:
public class Engine
private Configuration configuration;
@Inject
public Engine(Configuration configuration)
this.configuration = configuration;
........
public class Car
private Engine engine;
@Inject
public Car(Engine engine)
this.engine = engine;
En este caso tienes que manejar la burla y la inyección manualmente:
public class CarTestCase
private Configuration configuration;
private Engine engine;
private Car car;
@Before
public void setUp()
configuration = mock(Configuration.class);
engine = spy(new Engine(configuration));
car = new Car(engine);
@Test
public void test()
Mockito.when(configuration.getProperties("")).return("Something");
car.drive();
También encontré este problema durante las pruebas unitarias con el marco de arranque Spring, pero encontré una solución para usar @Spy y @InjectMocks
Respuesta anterior de Yoory N.
@Spy
@InjectMocks
private MySpy spy;
Debido a que InjectMocks necesita tener una instancia creada, la solución que funciona para mí está a continuación,
@Spy
@InjectMocks
private MySpy spy = new MySpy();
Eres capaz de apoyar nuestra publicación escribiendo un comentario o dejando una puntuación te damos las gracias.