mockito tutorial mockito framework
Ένας πλήρης οδηγός για το Mockito Framework: Hands-on Mockito Tutorials
ιστότοπος για τη μετατροπή βίντεο YouTube σε mp3
Η δοκιμή μονάδας είναι μια απλή αλλά αποτελεσματική τεχνική για να αποκτήσετε καλό επίπεδο εμπιστοσύνης στον κώδικα που πρόκειται να αποσταλεί.
Επιπλέον, αποφεύγει προβλήματα παλινδρόμησης με κάθε κομμάτι κώδικα που εισέρχεται.
Με την αρχιτεκτονική μικρο-υπηρεσιών (και ακόμη και για απλή δομή που περιλαμβάνει βασικές κλήσεις βάσης δεδομένων), η απλή δοκιμή μονάδας δεν αρκεί. Αυτό που χρειαζόμαστε είναι να χλευάσουμε τις εξαρτήσεις και να δοκιμάσουμε την πραγματική λογική της υπό δοκιμή μεθόδου.
Λίστα όλων των μαθημάτων Mockito σε αυτήν τη σειρά:
Εκμάθηση # 1: Πλαίσιο Mockito για χλευασμό σε δοκιμές μονάδας (Αυτό το σεμινάριο)
Εκμάθηση # 2: Δημιουργία χλευασμάτων και κατασκόπων στο Mockito
Εκμάθηση # 3: Διαφορετικοί τύποι αντιστοιχιών που παρέχονται από τον Mockito
Εκμάθηση # 4: Χλευάσουμε ιδιωτικές, στατικές και άκυρες μεθόδους χρησιμοποιώντας το Mockito
Εκμάθηση # 5: Κορυφαίες 12 ερωτήσεις συνέντευξης Mockito
************************************************* * *******************
Επισκόπηση των εκπαιδευτικών σε αυτήν τη σειρά Mockito
Εκμάθηση # | Τι θα μάθετε |
---|---|
Εκμάθηση # 1: | Πλαίσιο Mockito για χλευασμό σε δοκιμές μονάδας Μάθετε να κοροϊδεύετε με το Mockito - Ένα πλήρες σεμινάριο Mockito για αρχάριους με παραδείγματα κώδικα. Μάθετε Πλαίσιο Χλευάσματος για Χλευασμό στη Δοκιμή Μονάδων. |
Εκμάθηση # 2: | Δημιουργία χλευασμάτων και κατασκόπων στο Mockito Οι χλευασμοί και οι κατάσκοποι είναι τύποι διπλών δοκιμών, οι οποίοι είναι χρήσιμοι στη συγγραφή δοκιμών μονάδας. Και οι δύο εξηγούνται σε αυτό το σεμινάριο Mockito Spy με παραδείγματα κώδικα. |
Εκμάθηση # 3: | Διαφορετικοί τύποι αντιστοιχιών που παρέχονται από τον Mockito Μάθετε πώς να χρησιμοποιείτε διαφορετικούς τύπους αντιστοιχιών που παρέχονται από τη Mockito. Οι αντιστοιχιστές είναι σαν μπαλαντέρ όπου αντί για συγκεκριμένη είσοδο / έξοδο, καθορίζετε ένα εύρος εισόδου. Το επιχείρημα και η επαλήθευση είναι οι δύο τύποι Matcher στο Mockito που εξηγούνται λεπτομερώς εδώ. |
Εκμάθηση # 4: | Χλευάσουμε ιδιωτικές, στατικές και άκυρες μεθόδους χρησιμοποιώντας το Mockito Μάθετε Mocking Ιδιωτικές, Στατικές και Void μεθόδους στο Mockito με Παραδείγματα. Μάθετε να χλευάζετε ιδιωτικές και στατικές μεθόδους από το πλαίσιο δοκιμών μονάδας PowerMockito. |
Εκμάθηση # 5: | Κορυφαίες 12 ερωτήσεις συνέντευξης Mockito Mockito Συνέντευξη Ερωτήσεις και απαντήσεις με παραδείγματα κώδικα παραδείγματος. Αυτό θα σας βοηθήσει να κλείσετε οποιαδήποτε συνέντευξη με το Mockito Mocking Framework. |
Ας ξεκινήσουμε με το πρώτο σεμινάριο αυτής της σειράς !!
Τι θα μάθετε:
- Χλευασμός στις δοκιμές μονάδας
- Τύποι / Κατηγορίες διπλών δοκιμών
- Διαφορετικά πλαστά πλαίσια
- Πηγαίος κώδικας
- συμπέρασμα
- Συνιστώμενη ανάγνωση
Χλευασμός στις δοκιμές μονάδας
Το Mocks / Stubs είναι ένας όρος που συνήθως ακούνε οι άνθρωποι κατά τη δημιουργία συγκεκριμένων δοκιμών μονάδας.
Λοιπόν, τι ουσιαστικά είναι το χλευασμό; Με απλά λόγια, δεν είναι παρά μια ελεγχόμενη παρουσία ή εφαρμογή εξάρτησης από την οποία εξαρτάται ο υπό δοκιμή κώδικας για να δοκιμάσει τη βασική του λογική.
Ο λόγος που το ανέφερα ως ελεγχόμενη περίπτωση είναι ότι η συμπεριφορά της εξάρτησης μπορεί να προγραμματιστεί ή να ελεγχθεί όπως επιθυμείται για τη μέθοδο ή το υπό δοκιμή σύστημα.
Για να το εξηγήσουμε διαγραμματικά, ας πάρουμε ένα παράδειγμα οποιασδήποτε εφαρμογής για επιχειρήσεις ή ηλεκτρονικό εμπόριο. Σχεδόν κάθε τέτοιος τύπος εφαρμογής έχει κυρίως 3 επίπεδα, δηλαδή. Διεπαφή χρήστη, επίπεδο επιχείρησης και πρόσβαση δεδομένων (που μιλά στον υποκείμενο χώρο αποθήκευσης δεδομένων)
Αναφερόμενος στο παραπάνω διάγραμμα, το Business Layer έχει 3 εξαρτήσεις, δηλαδή το Data Access Layer και 2 άλλες υπηρεσίες που είναι οι Υπηρεσίες 1 και Υπηρεσία 2.
Κοιτάξτε το με αυτόν τον τρόπο - Μια εφαρμογή όπως οι χάρτες google μπορεί να έχει εξαρτήσεις από ένα
- Πραγματικές αποθήκες δεδομένων όπως η MySQL ή οποιαδήποτε άλλη βάση δεδομένων SQL που αποθηκεύει δεδομένα χάρτη.
- Μια εξωτερική υπηρεσία όπως το CoordinateService που παρέχει γεωγραφικά πλάτη και γεωγραφικά μήκη μιας τοποθεσίας.
- Μια εξωτερική υπηρεσία όπως η υπηρεσία κυκλοφορίας που παρέχει πληροφορίες κίνησης σε πραγματικό χρόνο για ένα συγκεκριμένο ζεύγος Συντεταγμένων.
Επομένως, εάν κάποιος προσπαθεί να επικυρώσει τη βασική επιχειρηματική λογική χρησιμοποιώντας το τεστ μονάδας, έως και αν δεν έχουν λειτουργικές υλοποιήσεις αυτών των εξαρτήσεων, οι δοκιμές δεν θα μπορούσαν να εκτελεστούν.
Οι χλευασμοί έρχονται να σώσουν σε αυτές τις καταστάσεις, όπου ανεξάρτητα από το αν η εξάρτησή σας είναι σε λειτουργία ή όχι, είστε πάντα εγγυημένοι ότι θα εκτελέσετε τη λογική της επιχείρησής σας με μια προγραμματισμένη απόκριση για την εξάρτηση που καλείται από τον υπό δοκιμή κώδικα.
Τύποι / Κατηγορίες διπλών δοκιμών
Το χλευασμό είναι ουσιαστικά ένας τύπος 'Test Double' - είναι μια τεχνολογική ορολογία. Το 'Test Double' ουσιαστικά σημαίνει ένα αντικείμενο που αντικαθίσταται από ισοδύναμη πραγματική παρουσία αντικειμένου ή εξάρτηση.
Υπάρχουν διαφορετικοί τύποι δοκιμαστικών διπλών όπως αναφέρεται παρακάτω:
# 1) Ψεύτικες:
Ένα ψεύτικο είναι μια λειτουργική εφαρμογή παρόμοια με μια πραγματική εξάρτηση, εκτός από το γεγονός ότι είναι τοπικό στο υπό δοκιμή σύστημα.
Παράδειγμα: Αντί να χτυπήσει μια πραγματική DB παραγωγής, η δοκιμή χρησιμοποιεί μια απλή συλλογή / μνήμη για την αποθήκευση δεδομένων.
# 2) Στελέχη:
Τα stubs είναι προκαθορισμένες αποκρίσεις όταν καλείται εξάρτηση από το υπό δοκιμή σύστημα.
# 3) Κατάσκοποι:
Όπως υποδηλώνει το όνομα, είναι στην πραγματικότητα η πραγματική λειτουργία (εξάρτηση) κλήσης με κάποιο μηχανισμό παρακολούθησης. Δημοσιεύστε την κλήση, μπορεί να επαληθευτεί εάν η κλήση ενεργοποιήθηκε ή όχι μαζί με τις παραμέτρους.
# 4) Χλευάσες:
Οι χλευασμοί είναι ειδικές περιπτώσεις αντικειμένων, στις οποίες μπορούν να καθοριστούν αντιδράσεις Stubbed / pre-configured. Το γεγονός ότι η ψεύτικη κλήση μπορεί να επαληθευτεί ως ισχυρισμός στο τεστ.
Για παράδειγμα:
Υπάρχει μια λειτουργία δημιουργίας αναφορών που στέλνει ένα email σε μια καθορισμένη διεύθυνση κατά την εκτέλεση.
Δεδομένου ότι δεν θέλουμε να στείλουμε πραγματικά μηνύματα ηλεκτρονικού ταχυδρομείου, ξανά και ξανά, κατά τη διάρκεια της δοκιμής, το EmailService είναι πλαστό (και η μέθοδος ηλεκτρονικού ταχυδρομείου που στέλνει το email έχει ρυθμιστεί να μην κάνει τίποτα όταν καλείται). Στο τέλος της δοκιμής, μπορούμε απλώς να επαληθεύσουμε ότι η μέθοδος αποστολής email της υπηρεσίας email κλήθηκε μέσω του πλαστή αντικειμένου.
Διαφορετικά πλαστά πλαίσια
Σχεδόν όλες οι γλώσσες παρέχουν διαφορετικά είδη κοροϊδευτικών πλαισίων. Θα συντάξουμε ένα δείγμα κώδικα χρησιμοποιώντας το Mockito, το οποίο είναι ένα πλαίσιο ανοιχτού κώδικα Mocking για Java.
Ανατομία ενός απλού τεστ μονάδας με πλαστή εξάρτηση. Ας υποθέσουμε, προσπαθούμε να δοκιμάσουμε μια εφαρμογή που υπολογίζει τα συνολικά σημάδια για έναν μαθητή σε όλα τα θέματα και την γράφει στο DB.
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); }
Τώρα, εάν θέλουμε να γράψουμε ένα τεστ μονάδας για τη μέθοδο - calculSumAndStore, τότε ίσως να μην έχουμε πραγματική εφαρμογή μιας βάσης δεδομένων για να αποθηκεύσουμε το σύνολο. Σε αυτήν την περίπτωση, δεν θα μπορέσουμε ποτέ να δοκιμάσουμε τη λειτουργία αυτής της μονάδας.
Όμως, με τη χρήση χλευασμάτων, μπορούμε απλά να περάσουμε ένα Mock για υπηρεσία βάσης δεδομένων και να επικυρώσουμε την υπόλοιπη λογική
Δοκιμή δείγματος όπως φαίνεται παρακάτω:
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = { 60, 70, 90 }; Mockito.doNothing().when(mockDatabase).updateScores('student1', 220); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 220); }
Είδαμε στην παραπάνω δοκιμή, έχουμε παράσχει ένα αντικείμενο mockDatabase στη γονική τάξη (για τη δοκιμαστική μέθοδο) και έχουμε δημιουργήσει μια απόκριση stub για το αντικείμενο mockedDatabase - Γραμμή # 6 παραπάνω (Mockito.doNothing (). When (mockDatabase) .updateScores ('student1', 220);)
Τα σημαντικά σημεία που πρέπει να σημειωθούν από τα παραπάνω είναι:
# 1) Το πλαστό αντικείμενο πρέπει να ρυθμίσει τις αποκρυπτογραφημένες απαντήσεις για όλες τις μεθόδους που θα κληθούν κατά την εκτέλεση της συνάρτησης.
#δύο) Οι παράμετροι που καθορίζονται κατά τη δημιουργία stub μπορεί να είναι συγκεκριμένες ή γενικές.
Παράδειγμα στην παραπάνω περίπτωση - έχουμε καθορίσει τις παραμέτρους για τη μέθοδο updateScores ως 'student1' και 220 επειδή γνωρίζουμε ότι αυτές είναι οι ακριβείς είσοδοι με τις οποίες θα καλείται η μέθοδος μας.
# 3) Κατά τη διάρκεια της επαλήθευσης, επικυρώνουμε τα εξής:
- Κλήθηκε η μέθοδος mockDatabase.updateScores.
- Τα επιχειρήματα ήταν «student1» & 220 αντίστοιχα.
- Η μέθοδος updateScores κλήθηκε 1 φορά.
Ας προσπαθήσουμε να αλλάξουμε λίγο αυτόν τον δοκιμαστικό κώδικα και να δούμε τι θα συμβεί:
Θα αλλάξω το όρισμα στο mock setup από 'student1' σε anyString (Το Mockito παρέχει ένα τυπικό matcher που ονομάζεται anyString ()) & 220 σε anyInteger (Το Mockito παρέχει ένα τυπικό matcher που ονομάζεται anyInt () και ταιριάζει με οποιαδήποτε ακέραια τιμή)
@Test 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('student1', 220); }
Δοκιμάστε να εκτελέσετε ξανά τη δοκιμή και η δοκιμή θα πρέπει να εξακολουθεί να είναι πράσινη.
(Τώρα ας προσπαθήσουμε να αλλάξουμε την επαλήθευση / ισχυρισμούς και να αλλάξουμε οποιοδήποτε από τα επιχειρήματα.
Ας αλλάξουμε 220 σε 230. Τώρα η προσδοκία είναι ότι το τεστ θα πρέπει να αποτύχει καθώς αυτό δεν είναι το αναμενόμενο επιχείρημα με το οποίο πρέπει να έχει κληθεί η βάση δεδομένων.
@Test 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('student1', 230); }
Αφού εκτελέσετε τη δοκιμή, ανατρέξτε στα αρχεία καταγραφής σφαλμάτων όπως φαίνεται παρακάτω (αναφέρει σαφώς ότι τα πραγματικά επιχειρήματα δεν ταιριάζουν με τα αναμενόμενα).
Τα επιχειρήματα είναι διαφορετικά! Καταζητούμενος:
mockDatabase.updateScores ('student1', 230);
-> στο com.mocking.sampleMocks.StudentScoreUpdatesUnitTests.calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb (StudentScoreUpdatesUnitTests.java:37)
Η πραγματική επίκληση έχει διαφορετικά επιχειρήματα:
mockDatabase.updateScores (“student1”, 220);
Πηγαίος κώδικας
Διεπαφή - IDatabase.java
public interface IDatabase { public void updateScores(String studentId, int total); }
Κατηγορία υπό δοκιμή - StudentScoreUpdates.java
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); } }
Κατηγορία δοκιμών μονάδας - StudentScoreUpdatesUnitTests.java
public class StudentScoreUpdatesUnitTests { @Mock public IDatabase mockDatabase; public StudentScoreUpdates studentScores; @BeforeEach public void beforeEach() { MockitoAnnotations.initMocks(this); } @Test 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('student1', 230); } }
συμπέρασμα
Αυτό που είδαμε μέχρι στιγμής είναι ένα πολύ βασικό και απλό παράδειγμα ρύθμισης Mock χρησιμοποιώντας το πλαίσιο Mockito της Java.
Για σχεδόν το 60-70% των δοκιμών μονάδας που περιλαμβάνουν χλευασμούς, οι δοκιμές πρέπει να έχουν παρόμοια δομή. Το Mockito παρέχει πολλές προηγμένες ρυθμίσεις παραμέτρων / υποστήριξη για εκτεταμένες ανάγκες κοροϊδεύσεων, πραγματοποιώντας ψεύτικες εμφανίσεις χρησιμοποιώντας εξάρτηση εξάρτησης, παρέχει στους κατασκόπους να παρακολουθούν πραγματικά μια πραγματική κλήση μεθόδου και να επαληθεύουν τις κλήσεις.
Το επερχόμενο σεμινάριό μας θα εξηγήσει περισσότερα για το Concept of Mocks and Spies στο Mockito.
Συνιστώμενη ανάγνωση
- Κορυφαίες 12 ερωτήσεις συνέντευξης Mockito (Συνέντευξη Mocking Framework)
- Εκμάθηση έκλειψης σε βάθος για αρχάριους
- Πώς να ρυθμίσετε το Node.js Testing Framework: Node.js Tutorial
- Γράφοντας μονάδες δοκιμών με Spock Framework
- Οι διαφορές μεταξύ δοκιμών μονάδας, δοκιμών ολοκλήρωσης και δοκιμών λειτουργίας
- Τα καλύτερα εργαλεία δοκιμής λογισμικού 2021 (QA Test Automation Tools)
- Εγχειρίδιο καταστροφικών δοκιμών και μη καταστροφικών δοκιμών
- Λειτουργική δοκιμή εναντίον μη λειτουργική δοκιμή