Agar siz DependencyInjectionTestExecutionListener (standart bo'lib o'rnatilgan) ishlatadigan bo'lsangiz, testlar uchun bog'liqliklar @ContextConfiguration yoki bog'liq annotatsiyalar yordamida sozlaganingiz dastur kontekstidagi binlardan kiritiladi. Bog'liqliklarni setter orqali, maydon orqali yoki o'zingiz tanlagan annotatsiyalarni qaerda joylashtirganingizga qarab, ikkalasi orqali ham kiritishingiz mumkin. Agar JUnit Jupiter ishlatsangiz, konstruktor orqali kiritishni ham tanlov sifatida ishlatishingiz mumkin (qarang: "Bog'liqliklarni SpringExtension orqali kiritish"). Spring annotatsiyalar asosidagi bog'liqliklarni qo'llab-quvvatlash bilan muvofiqligi uchun, @Autowired yoki JSR-330 dan @Inject annotatsiyalarini maydon va setter orqali kiritishda ishlatishingiz mumkin.
@Autowired yoki
@Inject annotatsiyalarini ishlatish test klassigna ta'sir ko'rsatmaydi.
public konstruktor yoki setter chaqirishingiz talab qilinmaydi.
@Autowired annotatsiyasi avtomatik aniqlash va tip bo'yicha bog'lash uchun foydalanilishidan, agar bir xil turdagi bir nechta bin aniqlangan bo'lsa, bu binlar uchun ushbu yondashuv ishlatilmaydi. Bu holatda @Autowired annotatsiyasini @Qualifier annotatsiyasi bilan birgalikda ishlatishingiz mumkin. @Inject annotatsiyasini @Named annotatsiyasi bilan birgalikda ishlatish ham mumkin. Agar test klassingiz o'z ApplicationContextiga kirish imkoniyatiga ega bo'lsa, aniq ketma-ket qidiruvni amalga oshirishingiz mumkin, masalan, applicationContext.getBean("titleRepository", TitleRepository.class) chaqiruvini ishlatib.
Agar test instansiyalaringizga bog'liqlikni kiritish kerak bo'lsa, maydon yoki setterlarni @Autowired yoki @Inject annotatsiyalar bilan belgilamang. Buning o'rniga, @TestExecutionListeners annotatsiyasidan foydalangan holda bog'liqlikni kiritishni to'liq o'chirib qo'yishingiz va DependencyInjectionTestExecutionListener.class ni tinglovchi ro'yxatidan chiqarib tashlashingiz mumkin.
Quyidagi kod listinglarida @Autowired annotatsiyasining maydonlar va setterlar uchun ishlatilishini ko'rsatadigan HibernateTitleRepository klassi testini o'tkazish ssenariysi keltirilgan, bu haqida "Maqsadlar" bo'limida aytilgan. Ilovalar konteksti konfiguratsiyasi misol kodlarining barcha listinglaridan keyin taqdim etiladi.
Quyidagi kod listinglarida bog'liqliklarni kiritishning logikasi JUnit Jupiterga xos emas. Ushbu bog'liqlik kiritish usullarini qo'llab-quvvatlanadigan boshqa test freymlari bilan birgalikda ham ishlatishingiz mumkin.
Quyidagi misollarda assertNotNull() kabi statik usullar chaqiriladi, ammo Assertions ni oldindan belgilashsiz. Bunday holatlarda, usul to'g'ri import static bayonoti orqali import qilingan deb qabul qilamiz, bu misolda ko'rsatilmagan.
Birinchi kod ro'yxati JUnit Jupiter asosidagi test klassining amalga oshirilishini ko'rsatadi, u @Autowired annotatsiyasini maydon orqali bog'liqlik kiritish uchun ishlatadi:
@ExtendWith(SpringExtension.class)
// ushbu test maydonchasi uchun yuklab olinadigan Spring konfiguratsiyasini belgilaydi
@ContextConfiguration("repository-config.xml")
class HibernateTitleRepositoryTests {
// bu instansiyaga tur bo'yicha bog'liqlik kiritiladi
@Autowired
HibernateTitleRepository titleRepository;
@Test
void findById() {
Title title = titleRepository.findById(new Long(10));
assertNotNull(title);
}
}
@ExtendWith(SpringExtension::class)
// ushbu test maydonchasi uchun yuklab olinadigan Spring konfiguratsiyasini belgilaydi
@ContextConfiguration("repository-config.xml")
class HibernateTitleRepositoryTests {
// bu instansiyaga tur bo'yicha bog'liqlik kiritiladi
@Autowired
lateinit var titleRepository: HibernateTitleRepository
@Test
fun findById() {
val title = titleRepository.findById(10)
assertNotNull(title)
}
}
Boshqa bir variant sifatida, klassni quyidagi ko'rsatmada ko'rsatilgandek, setter orqali bog'liqlik kiritish uchun @Autowired annotatsiyasidan foydalanadigan qilib sozlash mumkin:
@ExtendWith(SpringExtension.class)
// ushbu test maydonchasi uchun yuklab olinadigan Spring konfiguratsiyasini belgilaydi
@ContextConfiguration("repository-config.xml")
class HibernateTitleRepositoryTests {
// bu instansiyaga tur bo'yicha bog'liqlik kiritiladi
HibernateTitleRepository titleRepository;
@Autowired
void setTitleRepository(HibernateTitleRepository titleRepository) {
this.titleRepository = titleRepository;
}
@Test
void findById() {
Title title = titleRepository.findById(new Long(10));
assertNotNull(title);
}
}
@ExtendWith(SpringExtension::class)
// ushbu test maydonchasi uchun yuklab olinadigan Spring konfiguratsiyasini belgilaydi
@ContextConfiguration("repository-config.xml")
class HibernateTitleRepositoryTests {
// bu instansiyaga tur bo'yicha bog'liqlik kiritiladi
lateinit var titleRepository: HibernateTitleRepository
@Autowired
fun setTitleRepository(titleRepository: HibernateTitleRepository) {
this.titleRepository = titleRepository
}
@Test
fun findById() {
val title = titleRepository.findById(10)
assertNotNull(title)
}
}
Ilgari keltirilgan kod listinglarida @ContextConfiguration tomonidan murojaat qilingan bir xil XML-fayl konteksti ishlatilgan (ya'ni repository-config.xml). Quyida bu konfiguratsiya ko'rsatiladi:
<?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">
<!-- bu bin HibernateTitleRepositoryTests klassiga kiritiladi -->
<bean id="titleRepository" class="com.foo.repository.hibernate.HibernateTitleRepository">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- qisqartirish uchun konfiguratsiya keltirilmagan -->
</bean>
</beans>
Agar siz Spring tomonidan taqdim etilgan asosiy test klassini kengaytirayotgan bo'lsangiz, ularning settorlaridan birida @Autowired annotatsiyasidan foydalanayotgan bo'lsa, sizning dastur kontekstida mos keladigan turi bo'yicha bir nechta binlar mavjud bo'lishi mumkin (masalan, bir nechta DataSource binlari). Bunday holatda, settorni qayta belgilashingiz va maxsus maqsadli binni ko'rsatish uchun @Qualifier annotatsiyasidan foydalanishingiz mumkin, quyida ko'rsatilganidek (lekin unutmasdan, qayta belgilangan metodni superklassga delegatsiya qiling):
// ...
@Autowired
@Override
public void setDataSource(@Qualifier("myDataSource") DataSource dataSource) {
super.setDataSource(dataSource);
}
// ...
// ...
@Autowired
override fun setDataSource(@Qualifier("myDataSource") dataSource: DataSource) {
super.setDataSource(dataSource)
}
// ...
Ko'rsatilgan kvalifikator qiymati kiritilishi rejalashtirilgan aniq DataSource binini ko'rsatadi, bu esa mos keluvchi tur to'plamini aniq bin bilan cheklaydi. Uning qiymati mos <bean> ta'riflaridagi <qualifier> deklaratsiyalari bilan mos keladi. Bin nomi kvalifikator qiymati sifatida ishlatiladi, shuning uchun aniq binni nomi bilan to'g'ri ko'rsatishingiz mumkin (ilgari ko'rsatilganidek, myDataSource bin idsi ekanini faraz qilgan holda).
GO TO FULL VERSION