mocking private static
Научите ругање приватним, статичким и празним методама у Моцкито-у са примерима:
У овој серији практичних Водичи за Моцкито , погледали смо различите врсте Моцкито Матцхера у последњем упутству.
Уопштено говорећи, ругање приватним и статичким методама спада у категорију необичног ругања.
Ако се појави потреба за исмевањем приватних и статичких метода / класа, то указује на лоше преправљени код и заправо није код који се може тестирати и највероватније је да је реч о неком старом коду који раније није био врло прилагођен јединственом тесту.
Имајући то у виду, још увек постоји подршка за ругање приватним и статичким методама од стране неколико оквира за јединствено тестирање попут ПоверМоцкито-а (а не директно од Моцкито-а).
Исмевање „воид“ метода је уобичајено, јер можда постоје методе које у суштини не враћају ништа, попут ажурирања реда базе података (сматрајте то операцијом ПУТ крајње тачке Рест АПИ-а која прихвата улаз и не враћа никакве излазе).
Моцкито пружа потпуну подршку за исмевање метода празнина, што ћемо видети са примерима у овом чланку.
који је најбољи иоутубе за мп3
Шта ћете научити:
- Повермоцк - кратак увод
- Исмевање приватних метода
- Изругивање статичким методама
- Подругљиве методе празнине
- савети и Трикови
- Закључак
- Препоручено читање
Повермоцк - Кратки увод
За Моцкито не постоји директна подршка за исмевање приватних и статичких метода. Да бисте тестирали приватне методе, мораћете рефактор кода да бисте променили приступ заштићеном (или пакету) и мораћете да избегнете статичке / коначне методе.
По мом мишљењу, Моцкито намерно не пружа подршку за ове врсте подсмеха, јер је употреба ових врста конструкција кода смрад мириса и лоше дизајниран код.
Али, постоје оквири који подржавају ругање приватним и статичким методама.
Повермоцк проширује могућности других оквира попут ЕасиМоцк-а и Моцкито-а и пружа могућност исмевања статичких и приватних метода.
# 1) Како: Повермоцк то чини уз помоћ прилагођене манипулације бајт кодом како би подржао ругање приватним и статичким методама, завршним класама, конструкторима и тако даље.
# 2) Подржани пакети: Повермоцк нуди 2 АПИ-ја за проширење - један за Моцкито и један за еасиМоцк. Зарад овог чланка написаћемо примере са Моцкито наставком за повер моцк.
# 3) Синтакса :Повермоцкито има скоро сличну синтаксу као Моцкито, осим неких додатних метода за ругање статичким и приватним методама.
# 4) Повермоцкито подешавање
Да би се Моцкито библиотека укључила у пројекте засноване на градле-у, испод су библиотеке које треба укључити:
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '1.7.4' testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.7.4'
Сличне зависности су доступне и за мавен.
Повермоцк-апи-моцкито2 - Библиотека мора да садржи Моцкито екстензије за Повермоцкито.
Повермоцк-модуле-јунит4 - Модул је потребан да садржи ПоверМоцкРуннер (који је прилагођени покретач који се користи за покретање тестова са ПоверМоцкито-ом).
Овде је важно напоменути да ПоверМоцк не подржава Јунит5 тест руннер. Стога тестови треба да буду написани против Јунит4, а тестови треба да се изврше помоћу ПоверМоцкРуннер-а.
Да бисте користили ПоверМоцкРуннер - потребно је означити тест класу @РунВитх (ПоверМоцкРуннер.цласс)
Хајде сада да детаљно разговарамо, ругајући се приватним, статичким и празним методама!
Исмевање приватних метода
Исмевање приватних метода, које се интерно позивају из методе која се тестира, може бити неизбежно у одређено време. Коришћење Повермоцкито-а је то могуће, а верификација се врши новом методом под називом „верифиПривате“
Узмимо анПример где метода која се тестира позива приватну методу (која враћа логичку вредност). Да би овај метод могао да врати тачно / нетачно у зависности од теста, потребно је да се за ову класу постави клин.
За овај пример, класа која се тестира креирана је као шпијунска инстанца са исмевањем неколико позива интерфејса и позивања приватних метода.
Важне тачке Моцк Привате Метход-а:
# 1) Метод или класа теста морају бити означени са @ ПрепареФорТест (ЦлассУндерТест). Ова напомена говори поверМоцкито-у да припреми одређене класе за тестирање.
То ће бити углавном они часови који то морају бити Бајт кодом се манипулише . Типично за завршне часове, часови који садрже приватне и / или статичке методе којима се треба ругати током тестирања.
Пример:
@PrepareForTest(PriceCalculator.class)
#два) За подешавање квара на приватни метод.
Синтакса - када (лажна или шпијунска инстанца, „приватеМетходНаме“). тхенРетурн (// повратна вредност)
Пример:
when (priceCalculatorSpy, 'isCustomerAnonymous').thenReturn(false);
# 3) Да бисте верификовали приватни метод.
Синтакса - верифиПривате (моцкедИнстанце) .инвоке („приватеМетходНаме“)
Пример:
verifyPrivate (priceCalculator).invoke('isCustomerAnonymous');
Комплетан тестни узорак: Настављајући исти пример из претходних чланака, где прицеЦалцулатор има неке исмејане зависности попут итемСервице, усерСервице итд.
Створили смо нову методу под називом - ЦалцуПрицеВитхПриватеМетход, која позива приватну методу унутар исте класе и враћа да ли је купац анониман или не.
@Test @PrepareForTest(PriceCalculator.class) public void calculatePriceForAnonymous_witStubbedPrivateMethod_returnsCorrectPrice() throws Exception { // Arrange ItemSku item1 = new ItemSku(); item1.setApplicableDiscount(5.00); item1.setPrice(100.00); double expectedPrice = 90.00; // Setting up stubbed responses using mocks when(priceCalculatorSpy, 'isCustomerAnonymous').thenReturn(false); when(mockedItemService.getItemDetails(123)).thenReturn(item1); // Act double actualDiscountedPrice = priceCalculatorSpy.calculatePriceWithPrivateMethod(123); // Assert verifyPrivate(priceCalculator).invoke('isCustomerAnonymous'); assertEquals(expectedPrice, actualDiscountedPrice); }
Изругивање статичким методама
Статичке методе се могу ругати на сличан начин као што смо видели код приватних метода.
Када метода која се тестира укључује употребу статичке методе из исте класе (или из друге класе), мораћемо да укључимо ту класу у анотацију ПрепаФорТест пре теста (или у тест класи).
Важне тачке за лажне статичке методе:
# 1) Метод или класа теста морају бити означени са @ ПрепареФорТест (ЦлассУндерТест). Слично исмевању приватних метода / класа, ово је потребно и за статичке класе.
#два) Један додатни корак који је потребан за статичке методе је - моцкСтатиц (// назив статичке класе)
Пример:
mockStatic(DiscountCategoryFinder.class)
# 3) Постављање стуб-а на статички метод једнако је добро као и кицање било ког метода на било којој другој лажној инстанци интерфејса / класе.
На пример: Да бисте оштетили гетДисцоунтЦатегори () (који враћа енум ДисцоунтЦатегори са вредностима ПРЕМИУМ & ГЕНЕРАЛ) статички метод класе ДисцоунтЦатегориФиндер, једноставно стуб на следећи начин:
when (DiscountCategoryFinder. getDiscountCategory ()).thenReturn(DiscountCategory. PREMIUM );
# 4) Да бисте верификовали лажну поставку финалне / статичке методе, може се користити метода верифиСтатиц ().
Пример:
verifyStatic (DiscountCategoryFinder.class, times (1));
Подругљиве методе празнине
Покушајмо прво да схватимо какве врсте случајева употребе могу укључивати ометање празнина:
# 1) На пример, позиви метода - који шаљу обавештење е-поштом током процеса.
На пример :Претпоставимо да промените лозинку за свој рачун за Интернет банкарство, након што је промена успешна, добићете обавештење путем е-поште.
Ово се може сматрати / цхангеПассворд као ПОСТ позив Банк АПИ-у који укључује позив воид методе за слање обавештења е-поштом купцу.
#два) Још један уобичајени пример позива воид методе су ажурирани захтеви за ДБ који узимају неке податке и не враћају ништа.
Методе затрпавања празнине (тј. Методе које не враћају ништа или изузимају изузетак) могу се обрадити помоћу функције доНотхинг (), доТхров () и доАнсвер (), доЦаллРеалМетход () . Потребно је да се стуб постави помоћу горе наведених метода према очекивањима од теста.
Такође, имајте на уму да се сви позиви методе воид подразумевано изругују доНотхинг (). Дакле, чак и ако експлицитно лажно постављање није извршено ПРАЗНИНА позива методе, подразумевано понашање је и даље доНотхинг ().
Погледајмо примере за све ове функције:
За све примере, претпоставимо, да постоји класа СтудентСцореУпдатес која има метод израчунајСумАндСторе (). Ова метода израчунава збир бодова (као улаз) и позива а празнина метода упдатеСцорес () на инстанци базе податакаИмплементација.
public class StudentScoreUpdates { public IDatabase databaseImpl; public StudentScoreUpdates(IDatabase databaseImpl) { this.databaseImpl = databaseImpl; } public void calculateSumAndStore(String studentId, int() scores) { int total = 0; for(int score : scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); } }
Написаћемо јединствене тестове за позив моцк методе са следећим примерима:
# 1) доНотхинг () - доНотхинг () је подразумевано понашање за позиве методе воид у Моцкито-у, тј. Чак и ако верификујете позив методом воид (без изричитог подешавања празнине за доНотхинг (), верификација ће и даље бити успешна)
public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores(anyString(), anyInt()); }
Остале употребе уз доНотхинг ()
до) Када се метода воид позива више пута и желите да подесите различите одговоре за различите позиве, попут - доНотхинг () за први позив и баците изузетак на следећи позив.
На пример :Подесите моцк овако:
Mockito. doNothing ().doThrow(new RuntimeException()).when(mockDatabase).updateScores( anyString (), anyInt ());
б) Када желите да ухватите аргументе са којима је позвана метода воид, треба користити функционалност АргументЦаптор у Моцкито-у. Ово даје додатну верификацију аргумената са којима је метода позвана.
Пример са АргументЦаптор:
отварање .7з датотека на мац-у
public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); ArgumentCaptor studentIdArgument = ArgumentCaptor.forClass(String.class); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores(studentIdArgument.capture(), anyInt()); assertEquals('Student1', studentIdArgument.getValue()); }
# 2) доТхров ()- Ово је корисно када једноставно желите да изузмете изузетак када се метода воид позива из методе која се тестира.
На пример:
Mockito.doThrow(newRuntimeException()).when(mockDatabase).updateScores ( anyString (), anyInt ());
# 3) доАнсвер ()- доАнсвер () једноставно нуди интерфејс за извршавање неке прилагођене логике.
На пример. Модификовање неке вредности помоћу прослеђених аргумената, враћање прилагођених вредности / података које нормалан клинац није могао вратити, посебно за воид методе.
У сврху демонстрације - зауставио сам воид методу упдатеСцорес () да вратим „ одговор() “И исписати вредност једног од аргумената који је требало да се проследи када је требало позвати методу.
Пример кода:
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabaseImpl); int() scores = {60,70,90}; Mockito.doCallRealMethod().when(mockDatabaseImpl).updateScores(anyString(), anyInt()); doAnswer(invocation -> { Object() args = invocation.getArguments(); Object mock = invocation.getMock(); System.out.println(args(0)); return mock; }).when(mockDatabaseImpl).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert Mockito.verify(mockDatabaseImpl, Mockito.times(1)).updateScores(anyString(), anyInt()); }
# 4) доЦаллРеалМетход ()- Делимични подсмеви су слични клицима (где неке методе можете позвати праве методе, а остале).
За воид методе, моцкито пружа посебну функцију названу доЦаллРеалМетход () која се може користити када покушавате да подесите моцк. Оно што ће ово учинити је позвати методу реал воид са стварним аргументима.
На пример:
Mockito. doCallRealMethod ().when(mockDatabaseImpl).updateScores( anyString (), anyInt ());
савети и Трикови
# 1) Укључивање више статичких класа у исту методу / класу теста- Коришћење ПоверМоцкито-а ако постоји потреба за ругањем вишеструким статичким часовима завршних класа онда имена класа у @ ПрепареФорТест напомена се може споменути као вредност одвојена зарезом као низ (у основи прихвата низ имена класа).
Пример:
@PrepareForTest({PriceCalculator.class, DiscountCategoryFinder.class})
Као што је приказано у примеру изнад, претпоставимо да су и ПрицеЦалцулатор и ДисцоунтЦатегориФиндер коначне класе којима се треба ругати. Обоје се могу напоменути као низ класа у напомени ПрепареФорТест и могу се угурати у тест методу.
# 2) Позиционирање атрибута ПрепареФорТест - Позиционирање овог атрибута је важно с обзиром на врсту тестова који су укључени у класу Тест.
Ако сви тестови морају да користе исту завршну класу, онда има смисла споменути овај атрибут на нивоу класе теста, што једноставно значи да ће припремљена класа бити доступна свим тест методама. Насупрот овоме, ако је напомена наведена у методи испитивања, она ће бити доступна само тим одређеним тестовима
Закључак
У овом упутству смо разговарали о различитим приступима за исмевање статичких, коначних и празних метода.
Иако употреба пуно статичких или коначних метода омета тестирање, али ипак постоји подршка за тестирање / ругање која помаже у стварању јединствених тестова како би се постигло веће поверење у код / апликацију чак и за стари код који се обично не користи за бити дизајниран за тестирање.
За статичке и коначне методе Моцкито нема готову подршку, али библиотеке попут ПоверМоцкито (које у великој мери наслеђују пуно ствари од Моцкита) пружају такву подршку и морају да изврше манипулацију бајт кодом да би подржале ове функције.
Моцкито оут оф тхе бок подржава методе уклањања празнина и пружа разне методе попут доНотхинг, доАнсвер, доТхров, доЦаллРеалМетход итд. И може се користити према захтевима теста.
Најчешће постављана питања о интервјуу за Моцкито укратко су наведена у следећем водичу.
ПРЕВ Туториал |. | СЛЕДЕЋА Лекција
Препоручено читање
- Водич за Моцкито: Моцкито оквир за ругање у јединственом тестирању
- 12 најпопуларнијих питања о Моцкито интервјуу (Моцкинг Фрамеворк Интервиев)
- Статични у Ц ++
- Јава теме са методама и животним циклусом
- Стварање ругалица и шпијуна у Моцкито-у са примерима кода
- Различите врсте подударања које пружа Моцкито
- Методе и технике спречавања оштећења
- Како се користе методе у СоапУИ-у за масовно извршавање теста - Водич за СоапУИ бр. 10