मॉकिंग में सत्यापन

Java में Testing परिचय

Maria Milusheva

Senior Software Engineer

प्रेरणा: कोई रिटर्न वैल्यू नहीं

पिछले पाठ और अभ्यासों में, हमने रिटर्न वैल्यू पर assert करके टेस्ट किया था.

  • लेकिन अगर कोई रिटर्न वैल्यू ही न हो तो?

  • या रिटर्न वैल्यू महत्त्वपूर्ण/सूचनात्मक न हो?

उदाहरण: डेटाबेस में सेव करना.

फाइलें सेव होते हुए एक डेटाबेस का ग्राफिक

Java में Testing परिचय

उदाहरण: डेटाबेस

Database - डेटा के सुव्यवस्थित कलेक्शंस को स्टोर, मैनेज और सुरक्षित रखने वाली डिजिटल रिपॉजिटरी. कई डेटाबेस प्रोवाइडर होते हैं: कुछ लोकप्रिय डेटाबेस के लोगो

  • Database सर्वर टिकाऊ, सुरक्षित, विश्वसनीय होते हैं और लगभग असीम क्षमता रखते हैं

  • असली डेटाबेस यूनिट टेस्ट के लिए बहुत बड़े/जटिल होते हैं (पर इंटीग्रेशन टेस्ट में उपयोग हो सकते हैं)

Java में Testing परिचय

उदाहरण: लॉग मैसेज

मान लीजिए हम लॉग प्रोसेस कर रहे हैं:

public class MessageProcessor {
    private InfoStore infoStore;  // Will store info log messages here
    private ErrorStore errorStore; // Will store error log messages here

    public void saveMessage(String message) {
        if (message.startsWith("[INFO]")) {
            infoStore.save(message);
        }
        if (message.startsWith("[ERROR]")) {
            errorStore.save(message);
        }
    }
}
Java में Testing परिचय

InfoStore और ErrorStore

टेस्ट चलाने के लिए केवल बेसिक इंटरफेस चाहिए:

// Blueprints for InfoStore and ErrorStore
// Mocks don't need the mocked classes to be properly implemented
interface InfoStore {
    void save(String message);
}

interface ErrorStore {
    void save(String message);
}
Java में Testing परिचय

Mockito verify

हम बिना कोई डेटाबेस बनाए कैसे जाँचें कि मैसेज सेव हुआ?

यह assert करें कि mock इस्तेमाल हुआ:

import static org.mockito.Mockito.verify;

यह assert करें कि mock इस्तेमाल नहीं हुआ:

import static org.mockito.Mockito.verifyNoInteractions;
Java में Testing परिचय

टेस्ट सेटअप

@Test
void process_savesToInfoStore_whenInfoMessage() {
  InfoStore infoStore = mock(InfoStore.class);
  ErrorStore errorStore = mock(ErrorStore.class);
  MessageProcessor messageProcessor = new MessageProcessor(infoStore, errorStore);

String message = "[INFO] Process started."; messageProcessor.saveMessage(message); // Will use either InfoStore or ErrorStore
// जाँचें कि दोनों में से कौन-सा डेटाबेस इस्तेमाल हुआ verify(infoStore).save(message); verifyNoInteractions(errorStore); }
Java में Testing परिचय

टेस्ट फेल्योर मैसेज

यदि हम मैसेज को इस तरह बनाएँ:

String message = "[ERROR] Process failed!"

तो हमें ऐसे टेस्ट फेल्योर दिखेंगे:

Wanted but not invoked:
infoStore.save("[ERROR] Process failed!");
Actually, there were zero interactions with this mock.
Java में Testing परिचय

और सत्यापन तकनीकें

हम सटीक बार गिनकर भी वेरिफाई कर सकते हैं कि लॉग कितनी बार कॉल हुआ:

import static org.mockito.Mockito.times;
List<String> messages = new ArrayList<>(); // Create list and add elements
                messages.add("[INFO] Processing data...");
                messages.add("[INFO] Processing data...");
                messages.add("[INFO] Processing data...");

messageProcessor.saveMessageList(messages); // Save the three messages


verify(infoStore, times(3)).save("[INFO] Processing data...");
Java में Testing परिचय

अभ्यास करते हैं!

Java में Testing परिचय

Preparing Video For Download...