@Autowired bilan bahor jdbctemplateni masxara qilish

Mockito-ni soxta obyektlar kutubxonasi sifatida ishlataman. Men DAO ni birlashtirdim.

DAOlar JdbcTemplate-ni @Autowired orqali AOKga olishini kutadilar. Shuning uchun DAO'larda JDBC shabloni uchun birlashtiruvchi usullar mavjud emas.

Quyidagi testdan bahor dasturining kontekstim bor:



    

    
    
        
    

Sinovning bajarilish vaqtida bahor jdbctemplate misolini yaratadi va uni DAO ga olib borishini kutgan edim.

Lekin bu sodir bo'lmaydi - buning o'rniga men quyidagi istisnolardan foydalanaman:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:920)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:789)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474)
    ... 42 more

Bu yondashuvdan oldin kimdir muvaffaqiyat qozonganmi?

Rahmat.

1
DAO qatlami uchun alohida loyihamiz bor va bu biz 0% kodli qamrovli yagona loyiha bo'lib, biz DAO uchun yozma birliklar testlarini atlaymiz, chunki usul metodlarining ko'pchiligi bir liner (this.jdbcTemplate.query yoki yangilash) - lekin tashqi audit, bu (sinov doirasi yo'q) tanlangan va shuning uchun men tasdiqlash qutilarini belgilash uchun birlik testlari yozyapman ...
qo'shib qo'ydi muallif tapasvi, manba
Turli sabablarga ko'ra (Sybase ASE so'rovi sintaksikni qo'llab-quvvatlamaydi) ko'milgan ma'lumotlar bazasidan foydalana olmayapman .. va katıştırılmış ma'lumotlar bazasi bilan sinab haqiqiy sinov bo'lmaydi ... Mustaqil test ma'lumotlar bazasidan foydalanib, testni bajarish sekinlashadi ... va bizda 7 ta ishlab chiquvchi va bitta CI server ... shuning uchun testlar izolyatsiyada bajarilmaydi ...
qo'shib qo'ydi muallif tapasvi, manba
Bu, albatta, DAO haqida emas ... uning bahor texnik savoli: Siz qanday qilib avtoulovni sotib olishingiz va buyumni namunaviy zavod tomonidan qaytarilgan ob'ekt bilan birlashtirasiz?
qo'shib qo'ydi muallif tapasvi, manba
JdbcTemplateni masxara qilish nuqtasini ko'rmadim. JDbcTemplateni masxara qilish orqali DAOni sinab ko'rish nimani anglatadi? Test sinovingiz qanday bo'ladi?
qo'shib qo'ydi muallif JB Nizet, manba
Shunday qilib, sinovlar hech qanday sinovdan o'tmaydi, faqat sun'iy ravishda qamrovni kengaytirish uchun ishlatiladi. Kechirasiz, lekin bu juda ahmoqdir. Siz ham haqiqiy JdbcTemplate-dan foydalanishingiz va testdan istalgan istalgan vaziyatni yodda tutishingiz mumkin.
qo'shib qo'ydi muallif JB Nizet, manba
Menimcha, bu DAO loyihasi birlik sinovlari emas, balki integratsion testlardan foydalanishi kerak. Shunday qilib, siz DAO metodlari to'g'ri natijalarni ishlab chiqaradimi-yo'qligini tekshirib ko'rishingiz kerak. Bundan tashqari, DbUnit ga qarang.
qo'shib qo'ydi muallif kan, manba

2 javoblar

Muammo shundaki, umumiy kodni qaytaradigan standart usul mock hisoblanadi. Yo'q qilib bo'lgach, bahor ob'ekt turini qisqartira olmaydi, class xususiyati bilan aniq ob'ekt turini taqdim etishga harakat qiling.

public MockitoMockFactoryBean implements FactoryBean<?>
{
    private Class<?> objectType;

    @Override public Object getObject()
    {
        return Mockito.mock(objectType);
    }
    public void setObjectType(Class<?> objectType)
    {
        this.objectType=objectType;
    }
    @Override public Class<?> getObjectType()
    {
        return objectType;
    }
}
0
qo'shib qo'ydi
Qizil Qon: Sinf atributini ko'rsatishga harakat qildim - ishlamadim (hech qanday qo'shimcha xatolik yo'q).
qo'shib qo'ydi muallif tapasvi, manba
Ushbu FactoryBean yondashuvini tasdiqlashim mumkin.
qo'shib qo'ydi muallif tapasvi, manba
Oh, o'ng Agar "zavod-loviya" xususiyati bo'lsa, "class" xususiyati ishlatilmaydi . Keyin FactoryBean ilovasini yaratishdan boshqa variantni ko'rmadim, u to'g'ri kod turini getObjectType usuli bilan qaytaradi.
qo'shib qo'ydi muallif kan, manba

Sinov xavotirlariga yordam beradigan bir necha boshqa usullar mavjud:

Sizning haqiqiy ma'lumotlar bazasidan foydalanish:

Test qilish uchun Spring Framework ko'magi sizga o'rnatish vaqtida tranzaktsiyalarni ishga tushirish va ularni qayta tiklashda qaytarish, shuning uchun ma'lumotlar bazasi sinov ma'lumotlari bilan qoplanmagan. DBUnit ni murakkab o'rnatish uchun bu yordam berishi mumkin. Siz ta'kidlaganingizdek, bu birlik sinovlaridan ko'ra ko'proq vaqt talab etiladi. Shuning uchun ishlab chiquvchilar ko'pincha integratsiya testlarini ishlab chiquvchi qurishni bir qismi sifatida emas, balki qurilish bosqichida ishlaydigan alohida paketga ajratadilar.

MockRunner'dan foydalanish:

MockRunner natijalar majmui ma'lumotlarini joylashtiradigan soxta JDBC komponentlarini yaratish uchun kutubxona va JdbcTemplate farqni bilmaydi. Men faqat Bahordan foydalanib, MockDataSourceni ba'zi yordamchi sinflar yozmasdan yaratishingiz mumkinligiga ishonchim komil emas

Bahor kabellari bo'lmagan holda Mockito-ning sinovdan foydalanishi:

Mockito eng yaxshi asboblarni sinov uchun ishlatiladi. Shunday qilib, DAO testlari bahor yordamida simli emas, siz qo'lda DAO-ga qo'llashni taqiqlangan JdbcTemplateni yaratgan joyda birlik testi yaratasiz.

Agar siz faqatgina DAOdan ko'proq tekshirishga harakat qilmoqchi bo'lsangiz va bir nechta komponentni haqiqiy integratsiya testiga qanday qilib mos kelishini ko'rishni istasangiz, ma'lumotlar bazasini mocking haqiqiy ma'lumotlar bazasi bilan ochiladigan haqiqiy muammolarni yashiradi. Agar siz JDbcTemplates-dan soxta chiqishi bilan shaxsiy DAO'nizning to'g'ri ish tutishini nazarda tutsangiz, u holda Mockito yoki MockRunner yordamida buni amalga oshirishingiz mumkin.

0
qo'shib qo'ydi