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.

Aquí tienes un ejemplo de un archivo de arranque en Java con el uso de las anotaciones ConditionalOnProperty y Autowired en un miembro: “`java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; @Component @ConditionalOnProperty(name = “my.property.enabled”, havingValue = “true”) public class MiArchivoDeArranque { private final MiMiembroAutowirable miembroAutowirable; @Autowired public MiArchivoDeArranque(MiMiembroAutowirable miembroAutowirable) { this.miembroAutowirable = miembroAutowirable; } // Resto de tu código aquí } @Component public class MiMiembroAutowirable { // Resto de tu código aquí } “` En este código, se utiliza la anotación `@ConditionalOnProperty` para especificar que el archivo de arranque solo se activará si la propiedad `my.property.enabled` tiene el valor “true” en el archivo de configuración correspondiente. Además, el miembro `miembroAutowirable` se inyecta automáticamente usando la anotación `@Autowired`.

Tengo un objeto que se ve así:

@Service
@ConditionalOnProperty(
        name = "name",
        havingValue = "true"
)
public class MyClass{

    @Autowired(required = false)
    private SomeObject someObject;
}

Y tengo esto en mi archivo de prueba:

@ExtendWith({SpringExtension.class})
@ContextConfiguration(classes = {MyClass.class}, loader = AnnotationConfigContextLoader.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class MyTest {

    MyClass myClass;

    @Autowired
    @ConditionalOnProperty(
            name = "name",
            havingValue = "true"
    )
    static MyClass getMyClass(){
        return new MyClass();
    }

    @MockBean
    static SomeObject someObject;

    @BeforeAll
    public void before() {
        myClass = MyTest.getMyClass();
        when(someObject.someFunc()).thenReturn(1);
    }
}

Estoy usando esta función porque simplemente usar @Autowired y @MockBean en SomeObject no funcionaba debido al @ConditionalOnProperty.

El problema es que dentro de MyClass, someObject es nulo.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema podría estar en la forma en que estás simulando la clase SomeObject en tu archivo de prueba. Aunque la has anotado con @MockBean, es posible que no se esté inyectando en la instancia de MyClass debido a @ConditionalOnProperty.

    Para solucionar esto, puedes intentar quitar la anotación @ConditionalOnProperty de MyClass y, en su lugar, utilizar una clase de configuración diferente para tu archivo de prueba que establezca las propiedades deseadas para el contexto de la aplicación.

    Como alternativa, puedes intentar utilizar la anotación @MockBean directamente en la instancia de MyClass en tu archivo de prueba, en lugar de utilizar un método de fábrica estático para crearla. Esto debería garantizar que la instancia simulada de SomeObject se inyecte correctamente en MyClass.

Comments are closed.