creating mocks spies mockito with code examples
Εκπαιδευτικό Mockito Spy and Mocks:
Σε αυτό Mockito Tutorial σειρά , το προηγούμενο σεμινάριό μας μας έδωσε ένα Εισαγωγή στο Mockito Framework . Σε αυτό το σεμινάριο, θα μάθουμε την έννοια του Mocks και Spies στο Mockito.
Τι είναι οι χλευασμοί και οι κατάσκοποι;
Τόσο οι Mocks όσο και οι Spies είναι οι τύποι διπλών δοκιμών, οι οποίοι είναι χρήσιμοι στη συγγραφή δοκιμών μονάδας.
Τα χλεύη είναι μια πλήρης αντικατάσταση της εξάρτησης και μπορούν να προγραμματιστούν για να επιστρέψουν την καθορισμένη έξοδο κάθε φορά που καλείται μια μέθοδος στο mock. Το Mockito παρέχει μια προεπιλεγμένη εφαρμογή για όλες τις μεθόδους ενός πλαστή.
Τι θα μάθετε:
- Τι είναι οι κατάσκοποι;
- Δημιουργία χλευασμάτων
- Δημιουργία κατασκόπων
- Πώς να κάνετε έγχυση εξαρτημένων εξαρτήσεων για την κλάση / αντικείμενο που δοκιμάζεται;
- ΣΥΜΒΟΥΛΕΣ
- Παραδείγματα κώδικα - Κατασκοπεία και χλευασμοί
- Πηγαίος κώδικας
- Συνιστώμενη ανάγνωση
Τι είναι οι κατάσκοποι;
Οι κατάσκοποι είναι ουσιαστικά ένα περιτύλιγμα σε μια πραγματική εμφάνιση της πλαστή εξάρτησης. Αυτό σημαίνει ότι απαιτεί μια νέα παρουσία του αντικειμένου ή της εξάρτησης και στη συνέχεια προσθέτει ένα περιτύλιγμα του πλαστή αντικειμένου πάνω του. Από προεπιλογή, οι κατάσκοποι καλούν πραγματικές μεθόδους του αντικειμένου, εκτός και αν έχουν αποκοπεί.
Οι κατάσκοποι παρέχουν συγκεκριμένες πρόσθετες δυνάμεις όπως τα επιχειρήματα που δόθηκαν στην κλήση μεθόδου, ήταν η πραγματική μέθοδος που κλήθηκε καθόλου κ.λπ.
Με λίγα λόγια, για τους κατασκόπους:
- Απαιτείται η πραγματική παρουσία του αντικειμένου.
- Οι κατάσκοποι παρέχουν ευελιξία να κολλάει μερικές (ή όλες) τις μεθόδους του κατασκοπευτικού αντικειμένου. Εκείνη την εποχή, ο κατάσκοπος καλείται ουσιαστικά ή αναφέρεται σε ένα μερικώς πλαστό ή μαχαιρωμένο αντικείμενο.
- Οι αλληλεπιδράσεις που καλούνται σε ένα κατασκοπευτικό αντικείμενο μπορούν να παρακολουθούνται για επαλήθευση.
Σε γενικές γραμμές, οι κατάσκοποι δεν χρησιμοποιούνται πολύ συχνά, αλλά μπορούν να είναι χρήσιμοι για δοκιμές μονάδων παλαιών εφαρμογών όπου οι εξαρτήσεις δεν μπορούν να γελοιοποιηθούν πλήρως.
Για όλη την περιγραφή του Mock and Spy, αναφερόμαστε σε μια πλασματική τάξη / αντικείμενο που ονομάζεται 'DiscountCalculator' το οποίο θέλουμε να κοροϊδέψουμε / να κατασκοπεύσουμε.
Έχει μερικές μεθόδους όπως φαίνεται παρακάτω:
υπολογισμόςDiscount - Υπολογίζει την προεξοφλημένη τιμή ενός δεδομένου προϊόντος.
getDiscountLimit - Ανακτά το ανώτατο όριο έκπτωσης για το προϊόν.
Δημιουργία χλευασμάτων
# 1) Δημιουργία χλευάσματος με κώδικα
Το Mockito δίνει πολλές υπερφορτωμένες εκδόσεις του Mockito. Η μέθοδος χλευάζει και επιτρέπει τη δημιουργία χλευασμάτων για εξαρτήσεις.
Σύνταξη:
Mockito.mock(Class classToMock)
Παράδειγμα:
Ας υποθέσουμε ότι το όνομα της κλάσης είναι DiscountCalculator, για να δημιουργήσετε ένα πλαστό σε κωδικό:
DiscountCalculator mockedDiscountCalculator = Mockito.mock(DiscountCalculator.class)
Είναι σημαντικό να σημειωθεί ότι το Mock μπορεί να δημιουργηθεί και για διεπαφή ή για συγκεκριμένη κατηγορία.
Όταν ένα αντικείμενο είναι κοροϊδεύω, εκτός και αν έχει κολλήσει όλες οι μέθοδοι επιστρέφουν null από προεπιλογή .
DiscountCalculator mockDiscountCalculator = Mockito.mock(DiscountCalculator.class);
# 2) Δημιουργία χλευάσματος με σχολιασμούς
Αντί να κοροϊδεύει χρησιμοποιώντας τη στατική μέθοδο «mock» της βιβλιοθήκης Mockito, παρέχει επίσης έναν συντομότερο τρόπο δημιουργίας χλευασμάτων χρησιμοποιώντας τον σχολιασμό «@Mock».
Το μεγαλύτερο πλεονέκτημα αυτής της προσέγγισης είναι ότι είναι απλή και επιτρέπει τον συνδυασμό δήλωσης και ουσιαστικά αρχικοποίησης. Κάνει επίσης τις δοκιμές πιο ευανάγνωστες και αποφεύγει την επαναλαμβανόμενη αρχικοποίηση των χλευασμάτων όταν το ίδιο πλαστό χρησιμοποιείται σε διάφορα σημεία.
Προκειμένου να διασφαλιστεί η αρχικοποίηση του Mock μέσω αυτής της προσέγγισης, απαιτείται να καλέσουμε 'MockitoAnnotations.initMocks (this)' για την υπό δοκιμή τάξη. Αυτός είναι ο ιδανικός υποψήφιος για να συμμετάσχετε στη μέθοδο «BeforeEach» του Junit, η οποία διασφαλίζει ότι τα χλεύη αρχικοποιούνται κάθε φορά που εκτελείται μια δοκιμή από αυτήν την τάξη.
Σύνταξη:
@Mock private transient DiscountCalculator mockedDiscountCalculator;
Δημιουργία κατασκόπων
Παρόμοια με το Mocks, οι κατάσκοποι μπορούν επίσης να δημιουργηθούν με 2 τρόπους:
# 1) Δημιουργία κατασκόπων με κώδικα
Το Mockito.spy είναι η στατική μέθοδος που χρησιμοποιείται για τη δημιουργία ενός αντικειμένου / κατάσκοπου γύρω από την παρουσία του πραγματικού αντικειμένου.
Σύνταξη:
γ ++ τύποι κληρονομιάς
private transient ItemService itemService = new ItemServiceImpl() private transient ItemService spiedItemService = Mockito.spy(itemService);
# 2) Δημιουργία κατασκόπων με σχολιασμούς
Παρόμοια με το Mock, οι Spies μπορούν να δημιουργηθούν χρησιμοποιώντας το σχολιασμό @Spy.
Για την εκκίνηση του Spy, πρέπει επίσης να βεβαιωθείτε ότι το MockitoAnnotations.initMocks (αυτό) καλείται πριν χρησιμοποιηθεί το Spy στο πραγματικό τεστ για να ξεκινήσει ο κατάσκοπος.
Σύνταξη:
@Spy private transient ItemService spiedItemService = new ItemServiceImpl();
Πώς να κάνετε έγχυση εξαρτημένων εξαρτήσεων για την κλάση / αντικείμενο που δοκιμάζεται;
Όταν θέλουμε να δημιουργήσουμε ένα πλαστό αντικείμενο της υπό δοκιμή κλάσης με τις άλλες πλαστές εξαρτήσεις, μπορούμε να χρησιμοποιήσουμε το σχολιασμό @InjectMocks.
Αυτό που κάνει ουσιαστικά είναι ότι όλα τα αντικείμενα που επισημαίνονται με σχολιασμούς @Mock (ή @Spy) εγχέονται ως Εργολάβος ή ένεση ιδιοκτησίας στο αντικείμενο της κλάσης και, στη συνέχεια, οι αλληλεπιδράσεις μπορούν να επαληθευτούν στο τελικό αντικείμενο Mocked.
Και πάλι, περιττό να αναφέρω, το @InjectMocks είναι συντομογραφία κατά της δημιουργίας ενός νέου αντικειμένου της τάξης και παρέχει πλαστή αντικείμενα των εξαρτήσεων.
Ας το καταλάβουμε με ένα παράδειγμα:
Ας υποθέσουμε, υπάρχει μια τάξη PriceCalculator, η οποία έχει το DiscountCalculator και το UserService ως εξαρτήσεις που εισάγονται μέσω πεδίων Κατασκευαστή ή Ιδιότητας.
Έτσι, για να δημιουργήσουμε την εφαρμογή Mocked for Class calculator, μπορούμε να χρησιμοποιήσουμε 2 προσεγγίσεις:
# 1) Δημιουργία μια νέα παρουσία του PriceCalculator και εισάγετε τις εξαρτήσεις Mocked
@Mock private transient DiscountCalculator mockedDiscountCalculator; @Mock private transient UserService userService; @Mock private transient ItemService mockedItemService; private transient PriceCalculator priceCalculator; @BeforeEach public void beforeEach() { MockitoAnnotations.initMocks(this); priceCalculator = new PriceCalculator(mockedDiscountCalculator, userService, mockedItemService); }
# 2) Δημιουργία μια πλαστή παρουσία του PriceCalculator και εισάγετε εξαρτήσεις μέσω του σχολιασμού @InjectMocks
@Mock private transient DiscountCalculator mockedDiscountCalculator; @Mock private transient UserService userService; @Mock private transient ItemService mockedItemService; @InjectMocks private transient PriceCalculator priceCalculator; @BeforeEach public void beforeEach() { MockitoAnnotations.initMocks(this);
Ο σχολιασμός InjectMocks προσπαθεί πραγματικά να εισάγει πλαστές εξαρτήσεις χρησιμοποιώντας μία από τις παρακάτω προσεγγίσεις:
- Έγχυση βάσει κατασκευαστή - Χρησιμοποιεί τον Κατασκευαστή για την υπό δοκιμή τάξη.
- Με βάση τις μεθόδους Setter - Όταν ένας Κατασκευαστής δεν είναι εκεί, ο Mockito προσπαθεί να κάνει ένεση χρησιμοποιώντας ρυθμιστές ιδιοτήτων.
- Με βάση το πεδίο - Όταν τα παραπάνω 2 δεν είναι διαθέσιμα τότε προσπαθεί άμεσα να κάνει ένεση μέσω πεδίων.
ΣΥΜΒΟΥΛΕΣ
# 1) Ρύθμιση διαφορετικών στελεχών για διαφορετικές κλήσεις της ίδιας μεθόδου:
Όταν μια μέθοδος stubbed καλείται πολλές φορές μέσα στη δοκιμαζόμενη μέθοδο (ή η μέθοδος stubbed βρίσκεται στο βρόχο και θέλετε να επιστρέφετε διαφορετική έξοδο κάθε φορά), τότε μπορείτε να ρυθμίσετε το Mock για να επιστρέφει διαφορετική απόκριση κάθε φορά.
Για παράδειγμα: Ας υποθέσουμε ότι θέλετε Υπηρεσία για να επιστρέψετε ένα διαφορετικό στοιχείο για 3 διαδοχικές κλήσεις και έχετε δηλώσει Στοιχεία στη μέθοδο σας υπό δοκιμές ως Item1, Item2 και Item3, τότε μπορείτε απλά να τα επιστρέψετε για 3 διαδοχικές προσκλήσεις χρησιμοποιώντας τον παρακάτω κώδικα:
@Test public void calculatePrice_withCorrectInput_returnsValidResult() { // Arrange ItemSku item1 = new ItemSku(); ItemSku item2 = new ItemSku(); ItemSku item3 = new ItemSku(); // Setup Mocks when(mockedItemService.getItemDetails(anyInt())).thenReturn(item1, item2, item3); // Assert //TODO - add assert statements }
#δύο) Ρίχνουν την εξαίρεση μέσω του Χλευάσματος Αυτό είναι ένα πολύ κοινό σενάριο όταν θέλετε να δοκιμάσετε / επαληθεύσετε μια κατάντη / εξάρτηση που ρίχνει μια εξαίρεση και να ελέγξετε τη συμπεριφορά του υπό δοκιμή συστήματος. Ωστόσο, για να ρίξετε μια εξαίρεση από το Mock, θα χρειαστεί να ρυθμίσετε το στέλεχος χρησιμοποιώντας το thenThrow.
@Test public void calculatePrice_withInCorrectInput_throwsException() { // Arrange ItemSku item1 = new ItemSku(); // Setup Mocks when(mockedItemService.getItemDetails(anyInt())).thenThrow(new ItemServiceException(anyString())); // Assert //TODO - add assert statements }
Για αγώνες όπως το anyInt () και anyString (), μην εκφοβιστείτε καθώς θα καλυφθούν στα επερχόμενα άρθρα. Αλλά στην ουσία, σας δίνουν απλώς την ευελιξία να παρέχετε οποιαδήποτε τιμή Integer και String αντίστοιχα χωρίς συγκεκριμένα επιχειρήματα συνάρτησης.
Παραδείγματα κώδικα - Κατασκοπεία και χλευασμοί
Όπως συζητήθηκε προηγουμένως, τόσο οι Spies όσο και οι Mocks είναι ο τύπος των διπλών δοκιμών και έχουν τη δική τους χρήση.
Ενώ οι κατάσκοποι είναι χρήσιμοι για τον έλεγχο εφαρμογών παλαιού τύπου (και όπου δεν είναι δυνατή η χλεύη), για όλες τις άλλες όμορφες γραπτές μεθόδους / τάξεις, το Mocks επαρκεί για τις περισσότερες από τις ανάγκες δοκιμής της μονάδας.
Για το ίδιο παράδειγμα: Ας γράψουμε μια δοκιμή χρησιμοποιώντας το Mocks for PriceCalculator -> calculPrice method (Η μέθοδος υπολογίζει το στοιχείοPrice λιγότερες από τις ισχύουσες εκπτώσεις)
Η κλάση PriceCalculator και η μέθοδος υπό δοκιμή υπολογίζεται Η τιμή φαίνεται όπως φαίνεται παρακάτω:
public class PriceCalculator { public DiscountCalculator discountCalculator; public UserService userService; public ItemService itemService; public PriceCalculator(DiscountCalculator discountCalculator, UserService userService, ItemService itemService) { this.discountCalculator = discountCalculator; this.userService = userService; this.itemService = itemService; } public double calculatePrice(int itemSkuCode, int customerAccountId) { double price = 0; // get Item details ItemSku sku = itemService.getItemDetails(itemSkuCode); // get User and calculate price CustomerProfile customerProfile = userService.getUser(customerAccountId); double basePrice = sku.getPrice(); price = basePrice - (basePrice* (sku.getApplicableDiscount() + customerProfile.getExtraLoyaltyDiscountPercentage())/100); return price; } }
Τώρα ας γράψουμε ένα θετικό τεστ για αυτήν τη μέθοδο.
Θα σταματήσουμε την υπηρεσία userService και item όπως αναφέρεται παρακάτω:
- Το UserService θα επιστρέφει πάντα το CustomerProfile με το loyalDiscountPercentage που έχει οριστεί σε 2.
- Η υπηρεσία ItemService θα επιστρέφει πάντα ένα στοιχείο με τη βασική τιμή 100 και ισχύει Έκπτωση 5.
- Με τις παραπάνω τιμές, η αναμενόμενη τιμή που επιστρέφεται με τη μέθοδο που δοκιμάζεται είναι 93 $.
Εδώ είναι ο κωδικός για δοκιμή:
@Test public void calculatePrice_withCorrectInput_returnsExpectedPrice() { // 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; // Setting up stubbed responses using mocks when(mockedItemService.getItemDetails(anyInt())).thenReturn(item1); when(mockedUserService.getUser(anyInt())).thenReturn(customerProfile); // Act double actualPrice = priceCalculator.calculatePrice(123,5432); // Assert assertEquals(expectedPrice, actualPrice); }
Όπως μπορείτε να δείτε, στην παραπάνω δοκιμή - Υποστηρίζουμε ότι η πραγματική τιμή που επιστρέφεται με τη μέθοδο ισούται με την αναμενόμενη τιμή, δηλαδή 93,00.
Τώρα, ας γράψουμε μια δοκιμή χρησιμοποιώντας το Spy.
Θα κατασκοπεύσουμε το ItemService και θα κωδικοποιήσουμε την υλοποίηση του ItemService με τρόπο που να επιστρέφει πάντα ένα στοιχείο με τη βασική τιμή 200 και να ισχύει Έκπτωση 10,00% (το υπόλοιπο της πλαστής ρύθμισης παραμένει ίδια) όποτε καλείται με το skuCode του 2367.
java συνέντευξη ερώτηση και απαντήσεις για τους νεότερους
@InjectMocks private PriceCalculator priceCalculator; @Mock private DiscountCalculator mockedDiscountCalculator; @Mock private UserService mockedUserService; @Spy private ItemService mockedItemService = new ItemServiceImpl(); @BeforeEach public void beforeEach() { MockitoAnnotations.initMocks(this); } @Test public void calculatePrice_withCorrectInputRealMethodCall_returnsExpectedPrice() { // Arrange CustomerProfile customerProfile = new CustomerProfile(); customerProfile.setExtraLoyaltyDiscountPercentage(2.00); double expectedPrice = 176.00; // Setting up stubbed responses using mocks when(mockedUserService.getUser(anyInt())).thenReturn(customerProfile); // Act double actualPrice = priceCalculator.calculatePrice(2367,5432); // Assert assertEquals(expectedPrice, actualPrice);
Τώρα, ας δούμε ένα Παράδειγμα από μια εξαίρεση που ρίχτηκε από το ItemService, καθώς η διαθέσιμη ποσότητα αντικειμένου ήταν 0. Θα δημιουργήσουμε ψεύτικη για να ρίξουμε μια εξαίρεση.
@InjectMocks private PriceCalculator priceCalculator; @Mock private DiscountCalculator mockedDiscountCalculator; @Mock private UserService mockedUserService; @Mock private ItemService mockedItemService = new ItemServiceImpl(); @BeforeEach public void beforeEach() { MockitoAnnotations.initMocks(this); } @Test public void calculatePrice_whenItemNotAvailable_throwsException() { // Arrange CustomerProfile customerProfile = new CustomerProfile(); customerProfile.setExtraLoyaltyDiscountPercentage(2.00); double expectedPrice = 176.00; // Setting up stubbed responses using mocks when(mockedUserService.getUser(anyInt())).thenReturn(customerProfile); when(mockedItemService.getItemDetails(anyInt())).thenThrow(new ItemServiceException(anyString())); // Act & Assert assertThrows(ItemServiceException.class, () -> priceCalculator.calculatePrice(123, 234)); }
Με τα παραπάνω παραδείγματα, προσπάθησα να εξηγήσω την έννοια του Mocks & Spies και πώς μπορούν να συνδυαστούν για τη δημιουργία αποτελεσματικών και χρήσιμων δοκιμών μονάδας.
Μπορεί να υπάρχουν πολλοί συνδυασμοί αυτών των τεχνικών για να λάβετε μια σειρά δοκιμών που ενισχύουν την κάλυψη της υπό δοκιμή μεθόδου, διασφαλίζοντας έτσι ένα μεγάλο επίπεδο εμπιστοσύνης στον κώδικα και καθιστά τον κώδικα πιο ανθεκτικό στα σφάλματα παλινδρόμησης.
Πηγαίος κώδικας
Διεπαφές
Υπολογιστής έκπτωσης
public interface DiscountCalculator { double calculateDiscount(ItemSku itemSku, double markedPrice); void calculateProfitability(ItemSku itemSku, CustomerProfile customerProfile); }
Υπηρεσία
public interface ItemService { ItemSku getItemDetails(int skuCode) throws ItemServiceException; }
Υπηρεσία χρήστη
public interface UserService { void addUser(CustomerProfile customerProfile); void deleteUser(CustomerProfile customerProfile); CustomerProfile getUser(int customerAccountId); }
Εφαρμογές διεπαφής
ΈκπτωσηCalculatorImpl
public class DiscountCalculatorImpl implements DiscountCalculator { @Override public double calculateDiscount(ItemSku itemSku, double markedPrice) { return 0; } @Override public void calculateProfitability(ItemSku itemSku, CustomerProfile customerProfile) { } }
ItemServiceImpl
public class DiscountCalculatorImpl implements DiscountCalculator { @Override public double calculateDiscount(ItemSku itemSku, double markedPrice) { return 0; } @Override public void calculateProfitability(ItemSku itemSku, CustomerProfile customerProfile) { } }
Μοντέλα
ΠΡΟΦΙΛ ΤΟΥ πελάτη
public class CustomerProfile { private String customerName; private String loyaltyTier; private String customerAddress; private String accountId; private double extraLoyaltyDiscountPercentage; public double getExtraLoyaltyDiscountPercentage() { return extraLoyaltyDiscountPercentage; } public void setExtraLoyaltyDiscountPercentage(double extraLoyaltyDiscountPercentage) { this.extraLoyaltyDiscountPercentage = extraLoyaltyDiscountPercentage; } public String getAccountId() { return accountId; } public void setAccountId(String accountId) { this.accountId = accountId; } public String getCustomerName() { return customerName; } public void setCustomerName(String customerName) { this.customerName = customerName; } public String getLoyaltyTier() { return loyaltyTier; } public void setLoyaltyTier(String loyaltyTier) { this.loyaltyTier = loyaltyTier; } public String getCustomerAddress() { return customerAddress; } public void setCustomerAddress(String customerAddress) { this.customerAddress = customerAddress; } }
ItemSku
public class ItemSku { private int skuCode; private double price; private double maxDiscount; private double margin; private int totalQuantity; private double applicableDiscount; public double getApplicableDiscount() { return applicableDiscount; } public void setApplicableDiscount(double applicableDiscount) { this.applicableDiscount = applicableDiscount; } public int getTotalQuantity() { return totalQuantity; } public void setTotalQuantity(int totalQuantity) { this.totalQuantity = totalQuantity; } public int getSkuCode() { return skuCode; } public void setSkuCode(int skuCode) { this.skuCode = skuCode; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public double getMaxDiscount() { return maxDiscount; } public void setMaxDiscount(double maxDiscount) { this.maxDiscount = maxDiscount; } public double getMargin() { return margin; } public void setMargin(double margin) { this.margin = margin; } }
Κατηγορία υπό δοκιμή - Αριθμομηχανή τιμών
public class PriceCalculator { public DiscountCalculator discountCalculator; public UserService userService; public ItemService itemService; public PriceCalculator(DiscountCalculator discountCalculator, UserService userService, ItemService itemService){ this.discountCalculator = discountCalculator; this.userService = userService; this.itemService = itemService; } public double calculatePrice(int itemSkuCode, int customerAccountId) { double price = 0; // get Item details ItemSku sku = itemService.getItemDetails(itemSkuCode); // get User and calculate price CustomerProfile customerProfile = userService.getUser(customerAccountId); double basePrice = sku.getPrice(); price = basePrice - (basePrice* (sku.getApplicableDiscount() + customerProfile.getExtraLoyaltyDiscountPercentage())/100); return price; } }
Δοκιμές μονάδας - PriceCalculatorUnitTests
public class PriceCalculatorUnitTests { @InjectMocks private PriceCalculator priceCalculator; @Mock private DiscountCalculator mockedDiscountCalculator; @Mock private UserService mockedUserService; @Mock private ItemService mockedItemService; @BeforeEach public void beforeEach() { MockitoAnnotations.initMocks(this); } @Test public void calculatePrice_withCorrectInput_returnsExpectedPrice() { // 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; // Setting up stubbed responses using mocks when(mockedItemService.getItemDetails(anyInt())).thenReturn(item1); when(mockedUserService.getUser(anyInt())).thenReturn(customerProfile); // Act double actualPrice = priceCalculator.calculatePrice(123,5432); // Assert assertEquals(expectedPrice, actualPrice); } @Test @Disabled // to enable this change the ItemService MOCK to SPY public void calculatePrice_withCorrectInputRealMethodCall_returnsExpectedPrice() { // Arrange CustomerProfile customerProfile = new CustomerProfile(); customerProfile.setExtraLoyaltyDiscountPercentage(2.00); double expectedPrice = 176.00; // Setting up stubbed responses using mocks when(mockedUserService.getUser(anyInt())).thenReturn(customerProfile); // Act double actualPrice = priceCalculator.calculatePrice(2367,5432); // Assert assertEquals(expectedPrice, actualPrice); } @Test public void calculatePrice_whenItemNotAvailable_throwsException() { // Arrange CustomerProfile customerProfile = new CustomerProfile(); customerProfile.setExtraLoyaltyDiscountPercentage(2.00); double expectedPrice = 176.00; // Setting up stubbed responses using mocks when(mockedUserService.getUser(anyInt())).thenReturn(customerProfile); when(mockedItemService.getItemDetails(anyInt())).thenThrow(new ItemServiceException(anyString())); // Act & Assert assertThrows(ItemServiceException.class, () -> priceCalculator.calculatePrice(123, 234)); } }
Διαφορετικοί τύποι Matcher που παρέχονται από τον Mockito εξηγούνται στο επερχόμενο σεμινάριό μας
Εκπαιδευτικό πρόγραμμα PREV | ΕΠΟΜΕΝΟ Φροντιστήριο
Συνιστώμενη ανάγνωση
- Διαφορετικοί τύποι αντιστοιχιών που παρέχονται από τον Mockito
- Εκπαιδευτικό Mockito: Mockito Framework για χλευασμό σε δοκιμές μονάδας
- Δημιουργία δοκιμών εποχής χρησιμοποιώντας το epochs Studio για το Eclipse
- Εκμάθηση Python DateTime με παραδείγματα
- Αποκοπή εντολής στο Unix με παραδείγματα
- Unix Cat Command Syntax, Επιλογές με παραδείγματα
- Χρήση του δρομέα στο MongoDB με παραδείγματα
- Ls Command στο Unix με παραδείγματα