Wenn Sie Frontend-Tests schreiben, ist Mock Service Worker häufig die erste Wahl: MSW fängt Requests im Browser oder in Node ab und eignet sich sehr gut für Unit- und Komponententests. In diesem Leitfaden sehen Sie, wie Sie MSW praktisch einsetzen, wo die Grenzen liegen und wann eine gehostete API-Mocking-Plattform die bessere Ergänzung ist.
Was ist Mock Service Worker?
Mock Service Worker ist eine JavaScript-Bibliothek zum Abfangen von Netzwerkanfragen. Im Browser registriert MSW einen Service Worker, der ausgehende fetch- und XMLHttpRequest-Aufrufe verarbeitet. In Node patcht MSW die Request-Schicht, sodass dieselben Handler auch in Jest, Vitest oder anderen Node-Testumgebungen laufen.
Der Vorteil: Ihr Anwendungscode bleibt unverändert. Sie stubben nicht fetch, tauschen keinen HTTP-Client aus und schreiben Ihre Komponenten so, als würden sie echte APIs aufrufen. MSW sitzt dazwischen und liefert die definierte Antwort zurück. Den MSW-Quellcode auf GitHub können Sie nutzen, um die Interception-Schicht im Detail nachzuvollziehen.
Ein minimaler Handler sieht so aus:
import { http, HttpResponse } from 'msw'
export const handlers = [
http.get('/api/users/:id', ({ params }) => {
return HttpResponse.json({
id: params.id,
name: 'Ada Lovelace',
})
}),
]
Typisches Setup für Tests:
// src/mocks/server.js
import { setupServer } from 'msw/node'
import { handlers } from './handlers'
export const server = setupServer(...handlers)
// test/setup.js
import { beforeAll, afterEach, afterAll } from 'vitest'
import { server } from '../src/mocks/server'
beforeAll(() => server.listen())
afterEach(() => server.resetHandlers())
afterAll(() => server.close())
Damit lebt der Mock direkt neben Ihrem Code, ist versioniert und läuft reproduzierbar in CI.
Wo MSW glänzt
MSW ist besonders stark, wenn Mock und API-Konsument in derselben JavaScript-Codebasis liegen.
1. Komponenten- und Unit-Tests
Sie rendern eine Komponente, lassen sie echte Requests ausführen und geben kontrollierte Daten zurück.
import { render, screen } from '@testing-library/react'
import { http, HttpResponse } from 'msw'
import { server } from './mocks/server'
import UserProfile from './UserProfile'
test('zeigt den Benutzernamen an', async () => {
server.use(
http.get('/api/users/1', () => {
return HttpResponse.json({ id: 1, name: 'Ada Lovelace' })
})
)
render(<UserProfile userId="1" />)
expect(await screen.findByText('Ada Lovelace')).toBeInTheDocument()
})
Im Vergleich zu einem direkten Spy auf den HTTP-Client testet MSW näher am echten Verhalten. Wenn Sie den Unterschied sehen möchten, lesen Sie auch diesen Leitfaden zum Jest-Mock eines API-Aufrufs.
2. Lokale Frontend-Entwicklung
Sie können UI-Zustände entwickeln, bevor das Backend fertig ist:
http.get('/api/orders', () => {
return HttpResponse.json([])
})
Oder Fehler simulieren:
http.get('/api/orders', () => {
return new HttpResponse(null, { status: 500 })
})
Das ist nützlich für:
- Loading States
- Empty States
- Fehleranzeigen
- Berechtigungsfälle
- Edge Cases
3. Deterministische CI
Ihre Tests hängen nicht von Staging-Daten, Netzwerkbedingungen oder gemeinsam genutzten Testumgebungen ab. Jeder Test erhält exakt die Antwort, die der Handler definiert.
4. Ein Team, eine Sprache, ein Repo
Wenn dieselben Entwickler den Mock schreiben und konsumieren, ist MSW sehr effizient: Handler bleiben im Frontend-Repo, Pull Requests enthalten Code und Mock-Anpassungen zusammen.
Wenn das Ihre Situation beschreibt, brauchen Sie oft keine zusätzliche Mocking-Infrastruktur. MSW ist kostenlos, Open Source und genau für diesen Anwendungsfall gebaut.
Wo MSW an seine Grenzen stößt
Die Stärke von MSW — Mocks als Code im JavaScript-Repo — wird zur Einschränkung, sobald mehrere Teams, Sprachen oder Umgebungen beteiligt sind.
Nicht-JavaScript-Konsumenten
MSW-Handler sind JavaScript. Ein iOS-Team in Swift, ein Android-Team in Kotlin oder Backend-Integrationstests in Go oder Python können diese Handler nicht direkt wiederverwenden.
Dann entstehen schnell doppelte Mock-Implementierungen:
frontend/mocks/handlers.js
ios/MockUserService.swift
android/FakeUserApi.kt
backend/tests/mock_user_api.py
Diese Mocks können auseinanderlaufen. Ein sprachunabhängiger Mock-Server, der über HTTP erreichbar ist, löst dieses Problem: Jeder Client ruft dieselbe URL auf.
Geteilte, ständig verfügbare Mocks
MSW läuft im jeweiligen Prozess:
- im Browser-Tab
- im lokalen Dev-Server
- im Test-Runner
Es gibt keine gemeinsame stabile URL, die QA, Design, Mobile oder ein Partnerteam unabhängig nutzen kann.
Wenn mehrere Personen denselben Mock gleichzeitig verwenden sollen, brauchen Sie einen gehosteten Mock-Server mit fester Adresse.
Design-First- und schema-gesteuerte Workflows
Wenn Sie APIs zuerst in OpenAPI entwerfen, sollte der Mock aus dieser Spezifikation entstehen. So bleibt der Mock näher am Vertrag.
MSW erwartet dagegen handgeschriebene Handler:
http.get('/api/products/:id', ({ params }) => {
return HttpResponse.json({
id: params.id,
name: 'Example Product',
})
})
Das ist flexibel, aber nicht automatisch an das Schema gebunden. Wenn sich das OpenAPI-Schema ändert, müssen Sie die Handler selbst aktualisieren. Mehr dazu finden Sie im Leitfaden zum API-Mocking.
Realistische, dynamische Daten in größerem Umfang
MSW gibt zurück, was Sie programmieren. Für wenige Endpunkte ist das einfach. Bei vielen Ressourcen, verschachtelten Objekten und realistischen Testdaten wird es aufwendig.
Beispiel:
http.get('/api/users', () => {
return HttpResponse.json([
{
id: 'u_1',
name: 'Ada Lovelace',
email: 'ada@example.com',
createdAt: '2026-06-01T10:00:00Z',
role: 'admin',
},
])
})
Wenn Sie viele Felder und Varianten benötigen, müssen Sie Generierungslogik selbst schreiben oder zusätzliche Libraries einbinden. Plattformen mit integrierter Datengenerierung können solche Antworten direkt aus Feldnamen und Schemas ableiten.
MSW vs. eine vollständige API-Mocking-Plattform
Beide Ansätze lösen unterschiedliche Probleme. Die folgende Tabelle hilft bei der Entscheidung:
| Fähigkeit | Mock Service Worker | Gehostete API-Plattform (z.B. Apidog) |
|---|---|---|
| Läuft in JS Unit-/Komponententests | Ja, nativ | Nein, es ist keine JS-Testbibliothek |
| Sprachunabhängig über HTTP | Nein (nur JS) | Ja, jeder Client |
| Geteilte URL für das ganze Team | Nein | Ja, gehosteter Mock-Server |
| Mocks aus OpenAPI generieren | Manuell | Automatisch aus Schema |
| Intelligente/dynamische Datengenerierung | Manuell codiert | Integriert |
| Lebt in Ihrem Repo mit Tests | Ja | In einem gemeinsamen Projekt gespeichert |
| Kosten | Kostenlos, Open Source | Kostenloser Tarif + kostenpflichtige Pläne |
Kurz gesagt:
- Verwenden Sie MSW für Frontend-Tests und lokale Entwicklung.
- Verwenden Sie eine Plattform wie Apidog, wenn Mocks geteilt, sprachneutral oder aus einer Spezifikation generiert werden sollen.
Apidog als Ergänzung, nicht als Ersatz
Apidog ersetzt MSW nicht innerhalb von Jest oder Vitest. Es ist keine Library, die Sie in eine Testdatei importieren.
Betrachten Sie Apidog als Mocking-Schicht oberhalb Ihrer Unit-Tests:
- API entwerfen oder OpenAPI importieren.
- Mock automatisch aus dem Schema generieren.
- Gehostete Mock-URL im Frontend, Mobile Client oder QA-Test verwenden.
- Edge Cases oder spezifische Antworten konfigurieren.
Der praktische Unterschied:
MSW:
React-Komponententest -> MSW Handler -> Mock Response
Apidog:
Frontend / Mobile / QA / Partner -> gehostete Mock-URL -> Mock Response
Apidog kann Antworten aus dem Schema erzeugen und anhand von Feldnamen realistische Werte ableiten. Ein Feld wie email erhält beispielsweise eine E-Mail-ähnliche Antwort, createdAt ein Datum. Für gezielte Fehlerfälle können Sie benutzerdefinierte Regeln definieren, etwa eine bestimmte 500er-Antwort.
Da Mock, Design und Tests aus demselben API-Vertrag abgeleitet werden können, sinkt das Risiko, dass handgeschriebene Handler vom Vertrag abweichen. Einen breiteren Vergleich finden Sie in der Übersicht der besten API-Mocking-Tools.
Eine sinnvolle Aufteilung für Teams:
- MSW für Unit- und Komponententests im Frontend-Repo.
- Apidog für teamübergreifende Mocks, Demos, QA und Nicht-JS-Clients.
- OpenAPI als gemeinsame Quelle für API-Vertrag und Mock-Verhalten.
Sie müssen sich also nicht für nur ein Tool entscheiden. Verwenden Sie jedes dort, wo es am besten passt. Laden Sie Apidog herunter, wenn Sie einen gehosteten Mock parallel zu Ihrem MSW-Setup testen möchten.
Weitere wissenswerte MSW-Alternativen
MSW ist nicht die einzige Option. Je nach Stack können auch diese Tools sinnvoll sein:
- Mockoon: Desktop-App zum schnellen Erstellen lokaler Mock-Server mit GUI.
- WireMock: Java-basierter Mock-Server, besonders stark für JVM-Teams und Contract Testing.
- Prism von Stoplight: generiert Mocks aus OpenAPI-Dateien über die Kommandozeile.
- json-server: erstellt aus einer JSON-Datei schnell eine REST-API für Prototyping.
Grobe Entscheidungshilfe:
Frontend-Komponententests -> MSW
Schneller lokaler REST-Prototyp -> json-server oder Mockoon
OpenAPI-basierter CLI-Mock -> Prism
JVM-/Contract-Testing -> WireMock
Geteilter gehosteter Mock -> Apidog oder ähnliche Plattform
Wenn Ihr konkretes Problem lautet: „MSW hilft meinen Nicht-JS-Teamkollegen nicht“, dann brauchen Sie einen HTTP-basierten Mock-Server. Für React-spezifische Setups lesen Sie auch, wie Teams das Mocking von APIs in React mit Axios umsetzen.
Häufig gestellte Fragen
Ist MSW kostenlos?
Ja. Mock Service Worker ist Open Source unter der MIT-Lizenz und kann kostenlos in kommerziellen und nicht-kommerziellen Projekten verwendet werden.
Kosten entstehen erst, wenn Sie zusätzlich eine gehostete Plattform für gemeinsame Mocks einsetzen. Tools wie Apidog bieten dafür auch einen kostenlosen Tarif an.
Kann Apidog MSW in meinen Unit-Tests ersetzen?
Nein. MSW fängt Requests direkt innerhalb Ihres JavaScript-Test-Runners ab. Apidog ist eine gehostete Plattform und keine importierbare Testbibliothek.
Verwenden Sie MSW weiterhin für Jest, Vitest und Komponententests. Verwenden Sie Apidog für gemeinsame, teamübergreifende oder schema-gesteuerte Mocks. Wenn Sie sich auf In-Code-Mocking konzentrieren, ist diese Anleitung zum Mocken von API-Aufrufen hilfreich.
Funktioniert MSW in Node oder nur im Browser?
MSW funktioniert in beiden Umgebungen:
- Im Browser über einen Service Worker.
- In Node durch Patchen der Request-Schicht.
Dadurch können dieselben Handler in lokalen Frontend-Builds und in Testumgebungen wie Jest oder Vitest laufen.
Wann sollte ich von MSW zu einem gehosteten Mock-Server wechseln?
Sie müssen nicht vollständig wechseln. Häufig reicht es, einen gehosteten Mock-Server zusätzlich einzuführen.
Typische Signale:
- Mobile- oder Backend-Teams benötigen denselben Mock.
- QA braucht eine stabile URL.
- Mehrere Personen sollen denselben Mock gleichzeitig verwenden.
- Die API wird design-first über OpenAPI entwickelt.
- Mock-Daten sollen automatisch aus dem Schema generiert werden.
Fazit
MSW ist hervorragend für das, wofür es gebaut wurde: Requests innerhalb von JavaScript abfangen, Frontend-Komponenten testen und lokale Entwicklung ohne echtes Backend ermöglichen.
Es ist jedoch kein gehosteter, sprachunabhängiger Mock-Server. Sobald andere Teams, andere Programmiersprachen oder OpenAPI-basierte Workflows beteiligt sind, lohnt sich eine zusätzliche Plattform.
Eine praktische Architektur sieht so aus:
Frontend Unit Tests -> MSW
Lokale UI-Entwicklung -> MSW
Teamweite Integration -> Apidog
Mobile/QA/Partner -> Apidog Mock-URL
OpenAPI-basierte Mocks -> Apidog
Apidog deckt die gemeinsame, schema-gesteuerte Seite ab: gehosteter Mock-Server, echte URL, automatische Mocks aus Ihrem OpenAPI-Design und realistische Daten out-of-the-box. Behalten Sie MSW für Test-Runner-nahe Szenarien und nutzen Sie Apidog für alles, was über das Frontend-Repo hinausgeht.



Top comments (0)