Si usa DependencyInjectionTestExecutionListener (que está configurado de forma predeterminada), las dependencias de sus instancias de prueba se inyectan desde beans en el contexto de la aplicación que configuró usando @ContextConfiguration anotación o anotaciones relacionadas. Puede utilizar la inyección de dependencia del definidor, la inyección de dependencia de campo o ambas, según las anotaciones que elija y si las coloca en definidores o en campos. Si está utilizando JUnit Jupiter, también puede usar opcionalmente la inyección de constructor (consulte "Inyección de dependencia con SpringExtension"). Para mantener la coherencia con el soporte de inyección de dependencias basada en anotaciones de Spring, también puede usar la anotación @Autowired o la anotación @Inject de JSR-330 para realizar la inyección de dependencias a través de campos y definidores.

Para marcos de prueba distintos de JUnit Jupiter, el marco TestContext no participa en la creación de instancias de la clase de prueba. Por lo tanto, el uso de la anotación @Autowired o @Inject en los constructores no tiene ningún efecto en las clases de prueba.
Aunque no se recomienda utilizar la inyección de dependencias a través de un campo en el código para la implementación en un entorno de producción, inyectar dependencias a través de un campo en el código de prueba es bastante natural. La diferencia es que nunca tendrás que crear una instancia de tu clase de prueba directamente. Por lo tanto, no es necesario llamar al constructor o definidor public en su clase de prueba.

Porque la anotación @Autowired se utiliza para realizar detección y vinculación por tiposi tiene varias definiciones de beans del mismo tipo, no podrá utilizar este enfoque para esos beans específicos. En este caso, puede utilizar la anotación @Autowired en combinación con la anotación @Qualifier. También puede utilizar la anotación @Inject en combinación con la anotación @Named. Además, si su clase de prueba tiene acceso a su ApplicationContext, puede realizar una búsqueda secuencial explícita usando (por ejemplo) llamando a applicationContext.getBean("titleRepository", TitleRepository.class) .

Si necesita que se aplique la inyección de dependencia a sus instancias de prueba, no anote campos o configuradores con la anotación @Autowired o @Inject. Alternativamente, puede deshabilitar completamente la inyección de dependencia configurando explícitamente su clase para usar la anotación @TestExecutionListeners y excluyendo DependencyInjectionTestExecutionListener.class de la lista de oyentes.

Considere el escenario de prueba para la clase HibernateTitleRepository, como se describe en la sección "Metas". Los siguientes dos listados de códigos demuestran el uso de la anotación @Autowired para campos y configuradores. La configuración del contexto de la aplicación se presenta después de todos los listados de códigos de ejemplo.

La lógica de inyección de dependencia en los siguientes listados de código no es específica de JUnit Jupiter. Las mismas técnicas de inyección de dependencia se pueden utilizar en combinación con cualquier marco de prueba compatible.

Los siguientes ejemplos llaman a métodos estáticos con una aserción, como assertNotNull(), pero sin llamar primero a Assertions. En tales casos, suponga que el método se importó correctamente mediante una declaración import static, que no se muestra en el ejemplo.

La primera lista de código muestra una implementación de una clase de prueba basada en JUnit Jupiter que utiliza la anotación @Autowired para la inyección de dependencia a través de un campo:

Java
@ExtendWith(SpringExtension.class)
// define la configuración Spring cargada para este banco de pruebas
@ContextConfiguration("repositorio-config.xml")
clase HibernateTitleRepositoryTests {
    // a esta instancia se le inyectará una dependencia por tipo
    @autocableado
    HibernateTitleRepository titleRepository;
    @Prueba
    vacío findById() {
        Título título = titleRepository.findById(new Long(10));
        afirmarNotNull(título);
    }
}
Kotlin
@ExtendWith(SpringExtension::class)
// define la configuración Spring cargada para este banco de pruebas
@ContextConfiguration("repositorio-config.xml")
clase HibernateTitleRepositoryTests {
    // a esta instancia se le inyectará una dependencia por tipo
    @autocableado
    lateinit var titleRepository: HibernateTitleRepository
    @Prueba
    divertido encontrarById() {
        val título = títuloRepository.findById(10)
        afirmarNoNull(título)
    }
}

Como alternativa, puede configurar la clase para usar la anotación @Autowired para la inyección de dependencia a través de un definidor, como se muestra a continuación:

Java
@ExtendWith(SpringExtension.class)
// define la configuración Spring cargada para este banco de pruebas
@ContextConfiguration("repositorio-config.xml")
clase HibernateTitleRepositoryTests {
    // a esta instancia se le inyectará una dependencia por tipo
    HibernateTitleRepository titleRepository;
    @autocableado
    void setTitleRepository(HibernateTitleRepository titleRepository) {
        this.titleRepository = títuloRepositorio;
    }
    @Prueba
    vacío findById() {
        Título título = titleRepository.findById(new Long(10));
        afirmarNotNull(título);
    }
}
Kotlin
@ExtendWith(SpringExtension::class)
// define la configuración Spring cargada para este banco de pruebas
@ContextConfiguration("repositorio-config.xml")
clase HibernateTitleRepositoryTests {
    // a esta instancia se le inyectará una dependencia por tipo
    lateinit var titleRepository: HibernateTitleRepository
    @autocableado
    divertido setTitleRepository(titleRepository: HibernateTitleRepository) {
        this.titleRepository = títuloRepositorio
    }
    @Prueba
    divertido encontrarById() {
        val título = títuloRepository.findById(10)
        afirmarNoNull(título)
    }
}

Los listados de código anteriores utilizan el mismo archivo de contexto XML al que hace referencia la anotación @ContextConfiguration (es decir, repository-config.xml). Esta configuración se muestra a continuación:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- este bean se inyectará en la clase HibernateTitleRepositoryTests -->
    <bean id="titleRepository" class="com.foo.repository.hibernate.HibernateTitleRepository">
        <nombre de propiedad="sessionFactory" ref="sessionFactory"/>
    </frijol>
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <!-- configuración omitida por motivos de brevedad -->
    </frijol>
</beans>

Si extiende una clase de prueba principal proporcionada por Spring que usa la anotación @Autowired en uno de sus configuradores, es posible que tenga varios beans del tipo correspondiente definidos en el contexto de su aplicación (por ejemplo, múltiples beans DataSource ). En este caso, puede anular el definidor y utilizar la anotación @Qualifier para especificar un bean de destino específico, como se muestra a continuación (pero asegúrese de delegar también al método anulado en la superclase):

Java
// ...
    @autocableado
    @Anular
    setDataSource público vacío (@Qualifier("myDataSource") Fuente de datos fuente de datos) {
        super.setDataSource(fuente de datos);
    }
// ...
Kotlin
// ...
    @autocableado
    anular divertido setDataSource(@Qualifier("myDataSource") dataSource: DataSource) {
        super.setDataSource(fuente de datos)
    }
// ...

El valor del calificador especificado apunta al bean DataSource específico que se va a inyectar, reduciendo el conjunto de coincidencias de tipos al bean específico. Su valor se compara con las declaraciones <qualifier> en las definiciones <bean> correspondientes. El nombre del bean se utiliza como valor de retorno del calificador para que se pueda hacer referencia correctamente a un bean específico por nombre (como se mostró anteriormente, asumiendo que myDataSource es el id del bean).