different types matchers provided mockito
pl sql ερωτήσεις και απαντήσεις συνέντευξης για έμπειρο pdf
Εισαγωγή σε διαφορετικούς τύπους Matcher στο Mockito.
Χλευάσες και κατάσκοποι στο Mockito εξηγήθηκαν λεπτομερώς στο προηγούμενο σεμινάριο λεπτομερών Σειρά προπόνησης Mockito .
Τι είναι το Matchers;
Οι αντιστοιχιστές είναι όπως regex ή μπαλαντέρ όπου αντί για μια συγκεκριμένη είσοδο (και ή έξοδος), καθορίζετε ένα εύρος / τύπο εισόδου / εξόδου βάσει του οποίου μπορούν να ξεκουραστούν stubs / spies και μπορούν να επαληθευτούν οι κλήσεις προς stubs.
Όλοι οι ταιριαστές του Mockito είναι μέρος του « Μόκκιτο στατική τάξη.
Το Matchers είναι ένα ισχυρό εργαλείο, το οποίο επιτρέπει έναν σύντομο τρόπο ρύθμισης stubs, καθώς και την επαλήθευση επίκλησης στα stubs, αναφέροντας τις εισόδους ορίσματος ως γενικούς τύπους σε συγκεκριμένες τιμές, ανάλογα με την περίπτωση χρήσης ή το σενάριο.
Τι θα μάθετε:
Τύποι Matcher στο Mockito
Υπάρχουν γενικά 2 τύποι αντιστοιχιών στο Mockito ή όσον αφορά τη χρήση, οι αντιστοιχιστές μπορούν να χρησιμοποιηθούν για τις παρακάτω 2 κατηγορίες:
- Argument Matchers κατά τη ρύθμιση Stub
- Verification Matchers για την επαλήθευση των πραγματικών κλήσεων σε στέλεχος
Και για τους δύο τύπους Matchers, π.χ. Επιχείρηση και Επαλήθευση, το Mockito παρέχει ένα τεράστιο σύνολο αντιστοιχιστών (κλικ εδώ για να λάβετε μια πλήρη λίστα των ταιριαστών).
Αντιστοιχία επιχειρημάτων
Παρακάτω αναφέρονται οι πιο διαδεδομένες:
Για όλα τα παρακάτω, ας εξετάσουμε τη δοκιμή ενός IntegerList:
final List mockedIntList = mock(ArrayList.class);
# 1) any () - Δέχεται οποιοδήποτε αντικείμενο (συμπεριλαμβανομένου του null).
when (mockedIntList.get( any ())).thenReturn(3);
#δύο) οποιαδήποτε (τάξη γλώσσας java) -
Παράδειγμα : any (ClassUnderTest.class) - Αυτή είναι μια πιο συγκεκριμένη παραλλαγή οποιουδήποτε () και θα δέχεται μόνο αντικείμενα του τύπου κλάσης που αναφέρονται ως παράμετρος προτύπου.
when (mockedIntList.get( any (Integer.class))).thenReturn(3);
# 3) anyBoolean (), anyByte (), anyInt (), anyString (), anyDouble (), anyFloat (), anyList () και πολλά άλλα - Όλα αυτά δέχονται οποιοδήποτε αντικείμενο του αντίστοιχου τύπου δεδομένων καθώς και μηδενικές τιμές.
when (mockedIntList.get( any Int())).thenReturn(3);
# 4) Συγκεκριμένα επιχειρήματα - Σε περιπτώσεις όπου τα πραγματικά επιχειρήματα είναι γνωστά εκ των προτέρων, συνιστάται πάντοτε να τα χρησιμοποιείτε καθώς παρέχουν μεγαλύτερη εμπιστοσύνη σε σχέση με τους γενικούς τύπους επιχειρημάτων.
Παράδειγμα:
when(mockedIntList.get(1)).thenReturn(3);
Ταίριασμα επαλήθευσης
Υπάρχουν μερικοί εξειδικευμένοι ταιριαστές που είναι διαθέσιμοι για να περιμένουν / να ισχυρίζονται πράγματα όπως όχι. επίκλησης στο χλεύη.
Για όλες τις παρακάτω αντιστοιχίσεις, ας εξετάσουμε την ίδια λίστα παραδείγματος που χρησιμοποιήσαμε προηγουμένως.
final List mockedIntList = mock(ArrayList.class);
# 1) Προσκλήσεις σε πλαστά
(Εγώ) Η απλή επίκληση στο Mock επιβεβαιώνει εάν η πλαστή μέθοδος κλήθηκε / αλληλεπιδράθηκε ή όχι ρυθμίζοντας το μέγεθος της πλαστής λίστας σε 5.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList).size();
(ii) Ο συγκεκριμένος αριθμός αλληλεπιδράσεων με μια πλαστή μέθοδο επαληθεύει τον αριθμό του αριθ. μερικές φορές αναμενόταν να κληθεί η χλεύη.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(1)).size();
Για να επαληθεύσετε για 0 αλληλεπιδράσεις, απλώς αλλάξτε την τιμή από 1 σε 0 ως όρισμα για ταιριαστή φορές ().
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(0)).size();
Σε περίπτωση αστοχιών, επιστρέφει τις ακόλουθες εξαιρέσεις:
προς την) Όταν οι αναμενόμενες επίκληση είναι λιγότερες από τις πραγματικές επίκληση:
Παράδειγμα: Ζήτησε 2 φορές, αλλά επικαλέστηκε 3 φορές, τότε ο Mockito επιστρέφει - ' επαλήθευση.TooManyActualInvocations '
Παράδειγμα κώδικα:
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(3); response = mockedIntList.get(100); // Assert verify(mockedIntList, times(2)).get(anyInt());
σι) Όταν οι αναμενόμενες επίκληση είναι περισσότερες από τις πραγματικές επίκληση:
Παράδειγμα: Ζήτησε 2 φορές, αλλά επικαλέστηκε 1 φορά, τότε ο Mockito επιστρέφει - ' επαλήθευση.TooLittleActualInvocations '
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(3); response = mockedIntList.get(100); // Assert verify(mockedIntList, times(4)).get(anyInt());
(iii) Χωρίς αλληλεπιδράσεις με τη συγκεκριμένη μέθοδο του πλαστού αντικειμένου.
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); // Assert verify(mockedIntList, never()).size();
(iv) Επαληθεύστε τη σειρά των πλαστών αλληλεπιδράσεων - Αυτό είναι ιδιαίτερα χρήσιμο όταν θέλετε να διασφαλίσετε τη σειρά με την οποία κλήθηκαν οι μέθοδοι στα πλαστή αντικείμενα.
Παράδειγμα: Βάση δεδομένων όπως λειτουργίες όπου μια δοκιμή πρέπει να επαληθεύει τη σειρά με την οποία πραγματοποιήθηκαν οι ενημερώσεις βάσης δεδομένων.
Για να το επεξηγήσετε με το Παράδειγμα - Ας συνεχίσουμε με την ίδια λίστα παραδειγμάτων.
Ας υποθέσουμε, λοιπόν, ότι η σειρά των κλήσεων σε λίστα μεθόδων ήταν στη σειρά, δηλαδή get (5), size (), get (2). Επομένως, η σειρά επαλήθευσης θα πρέπει να είναι η ίδια.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); when(mockedIntList.size()).thenReturn(100); InOrder mockInvocationSequence = Mockito.inOrder(mockedIntList); // Act int response = mockedIntList.get(5); int size = mockedIntList.size(); response = mockedIntList.get(2); // Assert mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList).size(); mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt());
Σε περίπτωση λανθασμένης ακολουθίας επαλήθευσης, μια εξαίρεση απορρίπτεται από τον Mockito - δηλαδή ' verification.VerificationInOrderFailure '.
Έτσι, στο παραπάνω παράδειγμα, εάν αλλάξω τη σειρά επαλήθευσης αλλάζοντας τις δύο τελευταίες γραμμές, θα αρχίσω να λαμβάνω εξαίρεση VerificationInOrderFailure.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); when(mockedIntList.size()).thenReturn(100); InOrder mockInvocationSequence = Mockito.inOrder(mockedIntList); // Act int response = mockedIntList.get(5); int size = mockedIntList.size(); response = mockedIntList.get(2); // Assert mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList).size();
(v) Βεβαιωθείτε ότι η αλληλεπίδραση έχει συμβεί τουλάχιστον τουλάχιστον / φορές.
(προς την) τουλάχιστον:
Παράδειγμα: atleast (3) - Επαληθεύει ότι το πλαστό αντικείμενο κλήθηκε / αλληλεπίδρασε με atleast τρεις φορές κατά τη διάρκεια της δοκιμής. Επομένως, οποιαδήποτε από τις αλληλεπιδράσεις 3 ή μεγαλύτερη από 3 πρέπει να κάνει την επαλήθευση επιτυχημένη.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(2); // Assert verify(mockedIntList, atLeast(2)).get(anyInt());
Σε περίπτωση σφαλμάτων, δηλαδή όταν οι πραγματικές προσκλήσεις δεν ταιριάζουν, η ίδια εξαίρεση ρίχνεται όπως και με τους χρόνους () matcher, δηλ. ' επαλήθευση.TooLittleActualInvocations '
(σι) στο μέγιστο:
Παράδειγμα: atmost (3) - επαληθεύει εάν το πλαστό αντικείμενο επικαλέστηκε / αλληλεπίδρασε με τουλάχιστον τρεις φορές κατά τη διάρκεια της δοκιμής. Επομένως, οποιεσδήποτε από τις αλληλεπιδράσεις 0,1,2 ή 3 με το πλαστό θα πρέπει να κάνουν την επαλήθευση επιτυχημένη.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(2); // Assert verify(mockedIntList, atMost(2)).get(anyInt()); verify(mockedIntList, atMost(2)).size();
# 2) Αντιστοίχιση επιχειρημάτων
Στην παραπάνω επίκληση, οι αντιστοιχιστές μπορούν να συνδυαστούν μαζί με τα επιχειρήματα αντιστοίχισης για να επικυρώσουν τα επιχειρήματα με τα οποία κλήθηκε το ψεύτικο.
- όποιος()
- Ειδικές τιμές - Επαληθεύστε με τις συγκεκριμένες τιμές όταν τα επιχειρήματα είναι γνωστά εκ των προτέρων.
- Άλλοι αντιστοιχιστές επιχειρημάτων όπως - anyInt (), anyString () κ.λπ.
ΣΥΜΒΟΥΛΕΣ
# 1) Χρησιμοποιώντας το Argument Capture κατά την επαλήθευση
Η επαλήθευση Argument Capture είναι τυπικά χρήσιμη όταν το όρισμα που χρησιμοποιείται από κάποια μέθοδο stubbed δεν μεταβιβάζεται απευθείας μέσω μιας κλήσης μεθόδου αλλά δημιουργείται εσωτερικά όταν καλείται η υπό δοκιμή μέθοδος.
το καλύτερο μέρος για να παρακολουθήσετε δωρεάν anime στο διαδίκτυο
Αυτό είναι ουσιαστικά χρήσιμο όταν η μέθοδος σας εξαρτάται από έναν ή περισσότερους συνεργάτες των οποίων η συμπεριφορά έχει αποκοπεί. Τα επιχειρήματα που διαβιβάζονται σε αυτούς τους συνεργάτες είναι ένα εσωτερικό αντικείμενο ή ένα εντελώς νέο σύνολο επιχειρημάτων.
Η επικύρωση του πραγματικού επιχειρήματος με το οποίο θα κληθούν οι συνεργάτες διασφαλίζει μεγάλη εμπιστοσύνη στον κώδικα που δοκιμάζεται.
Το Mockito παρέχει το ArgumentCaptor το οποίο μπορεί να χρησιμοποιηθεί με επαλήθευση και, στη συνέχεια, όταν καλείται 'AgumentCaptor.getValue ()', μπορούμε να διεκδικήσουμε το πραγματικό όρισμα που καταγράφηκε εναντίον του αναμενόμενου.
Για να το διευκρινίσετε, ανατρέξτε στο παρακάτω παράδειγμα:
Στην παρακάτω μέθοδο, το calculPrice είναι το μοντέλο με την κλάση InventoryModel που δημιουργείται μέσα στο σώμα της μεθόδου το οποίο στη συνέχεια χρησιμοποιείται από το InventoryService για ενημέρωση.
Τώρα, εάν θέλετε να γράψετε μια δοκιμή για να επικυρώσετε το όρισμα με το οποίο κλήθηκε το inventoryService, θα μπορούσατε απλά να χρησιμοποιήσετε το αντικείμενο ArgumentCaptor της κλάσης InventoryModel τύπου.
Μέθοδος υπό δοκιμή:
public double calculatePrice(int itemSkuCode) { double price = 0; // get Item details ItemSku sku = itemService.getItemDetails(itemSkuCode); // update item inventory InventoryModel model = new InventoryModel(); model.setItemSku(sku); model.setItemSuppliers(new String(){'Supplier1'}); inventoryService.updateInventory(model, 1); return sku.getPrice(); }
Κωδικός δοκιμής: Κοιτάξτε το βήμα επαλήθευσης όπου επαληθεύεται το inventoryService, το αντικείμενο argumentCaptor αντικαθίσταται για το οποίο πρέπει να αντιστοιχιστεί το όρισμα.
Στη συνέχεια, απλώς επιβεβαιώστε την τιμή με την επίκληση της μεθόδου getValue () στο αντικείμενο ArgumentCaptor.
Παράδειγμα: ArgumentCaptorObject.getValue ()
public void calculatePrice_withValidItemSku_returnsSuccess() { // Arrange ItemSku item1 = new ItemSku(); item1.setApplicableDiscount(5.00); item1.setPrice(100.00); CustomerProfile customerProfile = new CustomerProfile(); customerProfile.setExtraLoyaltyDiscountPercentage(2.00); double expectedPrice = 93.00; // Arrange when(mockedItemService.getItemDetails(anyInt())).thenReturn(item1); ArgumentCaptor argCaptorInventoryModel = ArgumentCaptor.forClass(InventoryModel.class); // Act priceCalculator.calculatePrice(1234); // Assert verify(mockedItemService).getItemDetails(anyInt()); verify(mockedInventoryService).updateInventory(argCaptorInventoryModel.capture(), eq(1)); assertEquals(argCaptorInventoryModel.getValue().itemSku, item1);
Χωρίς το ArgumentCaptor δεν θα υπήρχε τρόπος να προσδιοριστεί με ποιο επιχείρημα έγινε η κλήση υπηρεσίας. Το καλύτερο δυνατό είναι να χρησιμοποιήσετε το 'any ()' ή 'any (InventoryModel.class)' για να επαληθεύσετε τα επιχειρήματα.
# 2) Κοινές εξαιρέσεις / σφάλματα κατά τη χρήση του Matchers
Κατά τη χρήση του Matchers, υπάρχουν ορισμένες συμβάσεις που πρέπει να ακολουθούνται, οι οποίες εάν δεν ακολουθούνται, καταλήγουν σε εξαίρεση. Το πιο συνηθισμένο που συνάντησα είναι κατά τη διάρκεια του τρυπήματος και της επαλήθευσης.
Εάν χρησιμοποιείτε οποιαδήποτε argumenMatchers και εάν η μέθοδος stubbed έχει περισσότερα από ένα ορίσματα (ες), τότε είτε όλα τα ορίσματα θα πρέπει να αναφέρονται με matchers, αλλιώς κανένα από αυτά δεν πρέπει να έχει matchers. Τώρα, τι σημαίνει αυτό;
Ας προσπαθήσουμε να το καταλάβουμε με ένα σενάριο (και στη συνέχεια δείγμα κώδικα για αυτό το σενάριο)
- Ας υποθέσουμε ότι η υπό δοκιμή μέθοδος έχει υπογραφή όπως -
concatenateString (String arg1, String arg2) - Τώρα όταν κάνετε stubbing - ας υποθέσουμε ότι γνωρίζετε την τιμή του arg1, αλλά το arg2 είναι άγνωστο, οπότε αποφασίσετε να χρησιμοποιήσετε έναν αντιστοιχιστή ορίσματος όπως - any () ή anyString () και καθορίζοντας μια τιμή για το πρώτο όρισμα, όπως κάποιο κείμενο 'hello'.
- Όταν εφαρμόζεται το παραπάνω βήμα και εκτελείται η δοκιμή, η δοκιμή ρίχνει μια εξαίρεση που ονομάζεται 'InvalidUseOfMatchersException'
Ας προσπαθήσουμε να το καταλάβουμε με ένα παράδειγμα:
Κωδικός δοκιμής:
// Arrange when(a gMatcher.concatenateString('hello', anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
Κατηγορία υπό δοκιμή:
qa ερωτήσεις και απαντήσεις συνέντευξης αυτοματοποίησης
public class ArgMatcher { public String concatenateString(String arg1, String arg2) { return arg1.concat(arg2); } }
Όταν εκτελείται η παραπάνω δοκιμή, επιστρέφει στο ' Μη έγκυροUseOfMatchersException '
Τώρα, ποιος είναι ο λόγος για αυτήν την εξαίρεση;
Είναι το stubbing με τη χρήση ανταλλακτικών μερικών και μερικής σταθερής συμβολοσειράς, δηλαδή έχουμε αναφέρει έναν αντιστοιχιστή ορίσματος ως 'γεια' και δεύτερος ως anyString (). Τώρα υπάρχουν 2 τρόποι για να απαλλαγείτε από τέτοιου είδους εξαιρέσεις (Σημειώστε επίσης - ότι αυτή η συμπεριφορά ισχύει τόσο για τις ρυθμίσεις Mock όσο και για τη συμπεριφορά).
# 1) Χρησιμοποιήστε το Argument Matchers για όλα τα επιχειρήματα:
// Arrange when(a gMatcher.concatenateString(anyString(), anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
# 2) Χρησιμοποιήστε το eq () ως το Argument Matcher όπου είναι γνωστό το επιχείρημα. Επομένως, αντί να καθορίσετε το όρισμα ως 'γεια', ορίστε το ως 'eq (' γεια ') και αυτό θα πρέπει να κάνει το stubbing επιτυχές.
// Arrange when(argMatcher.concatenateString(anyString(), eq('world'))).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'world'); // Assert verify(argMatcher).concatenateString(anyString(), eq('world'));
συμπέρασμα
Σε αυτό το άρθρο, είδαμε πώς να χρησιμοποιούμε διαφορετικούς τύπους αντιστοιχιών που παρέχονται από τη Mockito.
Εδώ, καλύψαμε τα πιο διαδεδομένα. Για αναφορά στην πλήρη λίστα, η τεκμηρίωση της βιβλιοθήκης Mockito είναι μια καλή πηγή αναφοράς.
Ρίξτε μια ματιά στο επερχόμενο σεμινάριό μας για να μάθετε περισσότερα σχετικά με τις ιδιωτικές, στατικές και άκυρες μεθόδους του Mocking
Εκπαιδευτικό πρόγραμμα PREV | ΕΠΟΜΕΝΟ Φροντιστήριο
Συνιστώμενη ανάγνωση
- Δημιουργία χλευασμάτων και κατασκόπων στο Mockito με παραδείγματα κώδικα
- Εκπαιδευτικό Mockito: Mockito Framework για χλευασμό σε δοκιμές μονάδας
- Τύποι κινδύνων σε έργα λογισμικού
- Τύποι δεδομένων Python
- Τύποι δεδομένων C ++
- Κορυφαίες 12 ερωτήσεις συνέντευξης Mockito (Mocking Framework Interview)
- Χλευάσουμε ιδιωτικές, στατικές και άκυρες μεθόδους χρησιμοποιώντας το Mockito
- Τύποι κληρονομικότητας σε C ++