mockall für Rust: vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

mockall für Rust: vollständige Anleitung mit Beispielen

1. Was ist mockall und warum braucht man es?

Die Bibliothek mockall ist ein leistungsstarkes Framework zur Erstellung automatischer Mock-Objekte in der Programmiersprache Rust. Sie wurde für das Modultesten (Unit-Tests) entwickelt und ermöglicht es Entwicklern, den zu testenden Code einfach von externen Abhängigkeiten wie Datenbanken, HTTP-Clients, Dateisystemen oder anderen Diensten zu isolieren. Im Gegensatz zum manuellen Schreiben von Test-Stubs generiert mockall automatisch Mock-Strukturen auf Basis vorhandener Traits und bietet eine flexible API zum Definieren von Erwartungen (Expectations) und zum Überprüfen von Aufrufen.

Warum ist das notwendig? In realen Projekten existiert Code selten im luftleeren Raum. Funktionen rufen andere Funktionen auf, Module hängen von externen Bibliotheken ab. Beim Testen eines einzelnen Moduls möchten wir nicht, dass der Test von der Funktionsfähigkeit einer Datenbank oder des Netzwerks abhängt. Mockall löst dieses Problem, indem es Mocks erstellt, die das Verhalten echter Abhängigkeiten nachahmen. Sie können festlegen, was eine Methode bei bestimmten Argumenten zurückgeben soll, wie oft sie aufgerufen werden darf, und sogar die Reihenfolge der Aufrufe überprüfen. Das macht Tests schnell, zuverlässig und reproduzierbar.

Die wichtigste Eigenschaft von mockall ist die Integration in das Typsystem von Rust und die Arbeit zur Kompilierzeit über das Attribut #[automock]. Das bedeutet, dass Mocks automatisch für jeden Trait generiert werden, was enorm viel Zeit spart und die Menge an Boilerplate-Code reduziert. Die Bibliothek unterstützt asynchrone Funktionen, Generics, Traits mit assoziierten Typen und vieles mehr, was sie zu einem unverzichtbaren Werkzeug für die ernsthafte Entwicklung mit Rust macht.

2. Installation

Um mockall in Ihrem Rust-Projekt zu verwenden, fügen Sie die Abhängigkeit in die Datei Cargo.toml ein. Die Bibliothek wird über den Standard-Paketmanager Cargo installiert. Es wird empfohlen, sie nur als dev-dependency hinzuzufügen, da sie ausschließlich zum Testen verwendet wird.


# Cargo.toml
[dev-dependencies]
mockall = "0.13"  # Verwenden Sie die aktuelle Version zum Zeitpunkt der Lektüre
        

Führen Sie nach dem Hinzufügen der Zeile den Befehl cargo build oder cargo test aus, damit Cargo die Bibliothek herunterlädt und kompiliert. Wenn Sie in einem Projekt mit anderen Abhängigkeiten arbeiten, stellen Sie sicher, dass die Version von mockall mit Ihrer Rust-Version kompatibel ist (in der Regel wird Rust 1.70+ benötigt). Die aktuelle Version finden Sie auf crates.io/crates/mockall.

3. Schnellstart

Erstellen wir ein minimales funktionierendes Beispiel. Angenommen, wir haben einen Trait Greeter, den wir in einem Test mocken möchten. Mit #[automock] erhalten wir automatisch die Struktur MockGreeter.


// src/lib.rs
use mockall::automock;

#[automock]
pub trait Greeter {
    fn greet(&self, name: &str) -> String;
}

pub fn run_greeter(greeter: &impl Greeter, name: &str) -> String {
    greeter.greet(name)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_greeting() {
        // Mock erstellen
        let mut mock = MockGreeter::new();

        // Erwartung definieren: Bei Aufruf von greet("Alice") "Hello, Alice!" zurückgeben
        mock.expect_greet()
            .with(predicate::eq("Alice"))
            .returning(|name| format!("Hello, {}!", name));

        // Die zu testende Funktion aufrufen
        let result = run_greeter(&mock, "Alice");

        // Ergebnis überprüfen
        assert_eq!(result, "Hello, Alice!");
    }
}
        

Starten Sie den Test mit dem Befehl cargo test. Wenn alles richtig konfiguriert ist, wird der Test erfolgreich durchlaufen.

Empfehlungen