es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Dependencias autowired anidadas no inyectadas en pruebas unitarias.

A continuación se muestra el código para demostrar el problema. La clase3 tiene un campo autowired de la clase2 y la clase2 tiene una dependencia autowired de la clase1, simpleTest para obtener el valor de cadena de la clase1 utilizando la clase3. Por lo tanto, en la ejecución de la prueba, la clase2 no es nula y se inyecta en la clase3, pero la clase1 es nula en la clase2.

@Component
class Class1 {
    private String str = "Algún texto";
    //getter setter
}

@Component
class Class2 {

    @Autowired
    Class1 class1;
    //getter setter
}

@Component
class Class3 {

    @Autowired
    Class2 class2;
    //getter setter
}

public class TestClass {

    @InjectMocks
    Class3 class3;

    @Spy
    Class2 class2;

    @Spy
    Class1 class1;

    @Test
    public void simpleTest() {

        String s = class3.class2.class1.getStr();
        Assert.equals(s, "Algún texto");

    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Problema con Autowiring Dependency en Java Spring

    El código dado anteriormente muestra un problema con la dependencia de autowiring en Java Spring. El componente Class3 está haciendo autowiring de Class2 y Class2 está haciendo autowiring de Class1. Sin embargo, la dependencia de Class1 no se está inyectando adecuadamente en Class2 durante la ejecución de la prueba. Por lo tanto, al intentar acceder al valor de String de Class1 a través de Class3, la prueba no logra obtener el valor esperado.

    Para resolver este problema, debemos inyectar adecuadamente la dependencia de Class1 en Class2. Una forma de hacer esto es utilizando la anotación @Autowired en el constructor de Class2. Por ejemplo, el código modificado para Class2 se vería así:

    @Component
    class Class2{
    
    private Class1 class1;
    
    @Autowired
    public Class2(Class1 class1){
        this.class1 = class1;
    }
    
    //getter setter
    }
    

    De esta manera, cuando Class2 se autowirea en Class3, tendrá una instancia de Class1 correctamente inyectada. El código modificado para la clase TestClass se vería así:

    public class TestClass{
    
    @InjectMocks
    Class3 class3;
    
    @Spy
    Class2 class2;
    
    @Autowired
    Class1 class1;
    
        @Test
        public void simpleTest(){
    
        String s = class3.getClass2().getClass1().getStr();
        Assert.equals(s,"Some String");
    
        }
    }
    

    Aquí también estamos utilizando la anotación @Autowired para inyectar una instancia de Class1 en TestClass, para que pueda ser pasada a Class2 a través del constructor al crear una instancia de Class2.

    Realizando los cambios adecuados, podemos recuperar exitosamente el valor esperado de Class1 a través de Class2 y Class3 durante la ejecución de la prueba.

Comments are closed.