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.
@Autowired
o
@Inject
en los constructores no tiene ningún efecto en las clases de prueba.
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:
@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);
}
}
@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:
@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);
}
}
@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):
// ...
@autocableado
@Anular
setDataSource público vacío (@Qualifier("myDataSource") Fuente de datos fuente de datos) {
super.setDataSource(fuente de datos);
}
// ...
// ...
@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).
GO TO FULL VERSION