Saltar al contenido

Mockito Inject simulacro en objeto espía

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *