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).