Wie schreibt man Test für einen Controller?

RezaScript

Bekanntes Mitglied
Hallo,

in Spring Boot habe ich einen RestController, der so aussieht:

Java:
@PostMapping(value = "/save-quote")
public Map<String, Object> saveQuote(@RequestBody NewQuote data) {
    return newQuoteService.saveQuote(data);
}

data könnte zum Beispiel sein:
JSON:
{
    "vorname": "Max",
    "name": "Mustermann",
    "aussehen": {
        "groesse": 180,
        "gewicht": 70
        "haarfarbe": "blond"
    }
}

Der Service liefert dann folgendes:
JSON:
{
    "status": "ok"
}
ODER
JSON:
{
    "status": "bad",
    "errors": {
        "vorname": "kein Wert",
        "gewicht": "Zahl ist zu hoch",
    }
}

Wie kann ich hierzu einen Test schreiben?
 

httpdigest

Top Contributor
Es hängt davon ab, was genau du testen möchtest.
Wenn du nur die Methode an sich testen möchtest, also nur der Signatur der Methode folgend, dann kannst du sie einfach aufrufen mit einer Instanz der NewQuota Klasse und eine Expectation auf die zurückkommende Map machen.
Bei allem weiteren würdest du ja "nur" zusätzlich testen, ob Spring Web richtig funktioniert und die Daten richtig marshalled und unmarshalled.
Das kann sinnvoll sein, wenn du z.B. deine Beans im Gesamtkontext der Anwendung als "Configuration Test" siehst und testen möchtest.
 

RezaScript

Bekanntes Mitglied
Also so habe ich es zumindest mal so probiert:

Java:
@SpringBootTest
@AutoConfigureMockMvc
class NewQuoteControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    void saveQuote() throws Exception {

        this.mvc.perform(
                post("/save-quote").contentType(MediaType.APPLICATION_JSON).content("""
                {
                    "name": "Mustermann",
                    "aussehen": {
                        "groesse": 180,
                        "gewicht": 70
                        "haarfarbe": "blond"
                    }
                }
                """
                ))
                .andDo(MockMvcResultHandlers.print())
                .andExpect(status().isOk())
                .andExpect(content().json("{ \"status\": \"ok\"}"));
    }
}

Das scheint sehr gut zu funktionieren.

Das ist mein erster Test, den ich bis jetzt geschrieben habe und um ehrlich zu sein, verstehe ich den Sinn und Zweck des ganzen nicht. Was soll jetzt hier der Unterschied zwischen dieses Scripts und ein Request mit Postman sein? Mit Postman muss ich nicht einmal etwas coden.
 

httpdigest

Top Contributor
Ich interpretiere deine Frage mal so:
"""
Warum sollte ich einen automatisierten Test für meine HTTP Schnittstellen im Service haben, die ich automatisiert während meines CI Builds ausführen kann, um festzustellen, dass meine Änderungen keine Fehler enthalten, wenn ich das ganze stattdessen nach einem Deployment/Start der Anwendung händisch per Postman UI ausführen könnte?
"""
Ich nehme mal an, dass du deine Postman Tests selbst auch nicht automatisiert via z.B. newman ausführen lässt.
Und selbst wenn du z.B. newman verwenden würdest, um deine Postman collection auszuführen, müsstest du dafür ja immer noch deine Anwendung zumindest mal deployen bzw. starten, um die Tests dagegen ausführen zu können.
Das musst du hingegen nicht (bzw. nicht in dem Maße) mit einem SpringBootTest.
 

Robert Zenz

Top Contributor
Was soll jetzt hier der Unterschied zwischen dieses Scripts und ein Request mit Postman sein?

Der Vorteil von automatisierten und im Projekt befindlichen Tests ist immer das sie automatisch im Projekt sind. Jeder Test fuer den du einen Extra-Schritt brauchst ist potenzielles "Oh, da habe ich darauf vergessen" oder noch besser "Davon wusste ich nichts". Alles immer und automatisiert direkt im Projekt zu machen ist immer die beste Loesung.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Spring Boot Test Assertions mit Objekten Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 Pfad zu Test Datei in application.yml in Spring Boot Test Frameworks - Spring, Play, Blade, Vaadin & Co 7
D Spring Boot Test ob Validation geprüft wurde Frameworks - Spring, Play, Blade, Vaadin & Co 8
8u3631984 Beim WebMVC Test wird Resource File nicht gefunden. Frameworks - Spring, Play, Blade, Vaadin & Co 1
T Repository wird null im Test Frameworks - Spring, Play, Blade, Vaadin & Co 6
D SpringBootTest H2 Database für Test Frameworks - Spring, Play, Blade, Vaadin & Co 5
M Validations-Test mit @Size Frameworks - Spring, Play, Blade, Vaadin & Co 1
8u3631984 Test Properties aus application.yml Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Spring Unit Test: UnsatisfiedDependencyException: Error creating bean with name Frameworks - Spring, Play, Blade, Vaadin & Co 2
8u3631984 Bestpractice : Test JPA Repositories Frameworks - Spring, Play, Blade, Vaadin & Co 9
8u3631984 Autowired App im Test später starten Frameworks - Spring, Play, Blade, Vaadin & Co 0
8u3631984 Spring JPA Test in Gradle Sub Module Frameworks - Spring, Play, Blade, Vaadin & Co 1
T JUnit parametrisierter Test Frameworks - Spring, Play, Blade, Vaadin & Co 4
8u3631984 Spring Test findet Component nicht Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Spring Boot Test mit Junit Frameworks - Spring, Play, Blade, Vaadin & Co 8
bueseb84 Unit Test mit Spring Boot - Service Autowired Frameworks - Spring, Play, Blade, Vaadin & Co 5
F Spring Boot Test Frameworks - Spring, Play, Blade, Vaadin & Co 14
S Integrations Test in Java mit Spring Frameworks - Spring, Play, Blade, Vaadin & Co 2
J Test mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Transaktionaler Spring Test ohne von AbstractTransactionalJUnit4SpringContextTests zu erben Frameworks - Spring, Play, Blade, Vaadin & Co 4
ExceptionOfExpectation In Meiner Spring-Boot Applikation verlangt die Datenbank Wert für eine ID Frameworks - Spring, Play, Blade, Vaadin & Co 5
ExceptionOfExpectation @Value() für application.properties [SpringBoot] Frameworks - Spring, Play, Blade, Vaadin & Co 9
H Konfigurierbarer Filter für OSGi service-Referenz in blueprint Frameworks - Spring, Play, Blade, Vaadin & Co 0
OnDemand Suche "Wizard" für Vaadin für Unterstützung bei Erstbenutzung von Funktionen Frameworks - Spring, Play, Blade, Vaadin & Co 2
Zrebna Vaadin: ToolbarButton - Breite für Caption reicht nicht aus. Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Kein Endpoint für Swagger UI Frameworks - Spring, Play, Blade, Vaadin & Co 6
N Spring Boot - Overkill für private Projekte? Frameworks - Spring, Play, Blade, Vaadin & Co 3
Z JPA Extra-Entity für Many-To-Many gewissermaßen zu Fuß Frameworks - Spring, Play, Blade, Vaadin & Co 5
R Architektur für Spring Boot Projekt Frameworks - Spring, Play, Blade, Vaadin & Co 5
LesterBurnham Spring, Config Server, mehrere Gitlab Repos für Konfiguration - best practices Frameworks - Spring, Play, Blade, Vaadin & Co 1
J Framework für KI Frameworks - Spring, Play, Blade, Vaadin & Co 4
Thallius Gibt es einen "Standard" Folder für Spring deployment auf Linux Servern? Frameworks - Spring, Play, Blade, Vaadin & Co 13
C Suche Tutorial für - Spielfiguren springen lassen Frameworks - Spring, Play, Blade, Vaadin & Co 4
K Spring Security für Java SE Frameworks - Spring, Play, Blade, Vaadin & Co 2
M Konfiguration von Spring Security für httpBasic Auth und jdbc Authentication. Frameworks - Spring, Play, Blade, Vaadin & Co 3
J Resolver für XML Schema Location beim Laden des Spring Application Context Frameworks - Spring, Play, Blade, Vaadin & Co 1
G Suche einfaches Beispiel für AspectJ (ohne Spring AOP) Frameworks - Spring, Play, Blade, Vaadin & Co 1
B Buchempfehlung für Groovy, Spring, Hibernate, SOAP, J2EE gesucht Frameworks - Spring, Play, Blade, Vaadin & Co 1
G Spring <spring:message für Images Frameworks - Spring, Play, Blade, Vaadin & Co 1
A Spring MVC / JSP und Defaultwerte für nicht ausgefüllte Textfelder Frameworks - Spring, Play, Blade, Vaadin & Co 0
A Eclipse Projekt für Entwicklung mit Spring Webflow 2.2 Frameworks - Spring, Play, Blade, Vaadin & Co 2
S Spring IDE Plugin für eclipse Frameworks - Spring, Play, Blade, Vaadin & Co 12
S Wo kann man das Spring IDE Plugin für Eclipse downloaden? Frameworks - Spring, Play, Blade, Vaadin & Co 0
A Anleitung für JSF 2.0 und Spring Web Flow 2.1 Frameworks - Spring, Play, Blade, Vaadin & Co 1
S Spring für Anfänger Frameworks - Spring, Play, Blade, Vaadin & Co 21
I Annotation für JSF 1.2 bei SPRING 3.0 Frameworks - Spring, Play, Blade, Vaadin & Co 6

Ähnliche Java Themen

Neue Themen


Oben