Spring Boot Test ob Validation geprüft wurde

DrPils

Bekanntes Mitglied
Hi

Gibt es eine Möglichkeit zu Testen ob bei Aufruf einer Methode die Validierung durchgeführt wird?

Ich will nicht prüfen wann ein Parameter valide ist, sondern sichergehen dass die Prüfung stattfindet.
 

Marinek

Bekanntes Mitglied
Hi,
ja das sollte trivial gehen:

  • Überlege dir, welche Eingaben gültig sind und welche Antwort du dazu erwartest.
  • Überlege dir, welche Eingaben UNGÜLTIG sind und welche Antwort du dazu erwartest.

Schreibe einen Test mit beiden Szenarien. Wenn die Prüfung, wie gewünscht läuft, erhälst du die gewünschten Ergebnise. Anderensfalls nicht.

Es gibt aber keine Möglichkeit zu sagen assert "Validation is running".

Gruß
 

mrBrown

Super-Moderator
Mitarbeiter
Man könnte vielleicht einen eigenen Validator (oder was auch immer da das passende ist) bereitstellen, den Methodeaufruf ausführen und prüfen, dass die entsprechenden Methoden aufgerufen wurden, zB mit Mockito Spys.

Aber keine Ahnung ob’s funktioniert, der Weg von @Apple’s Jünger sollte in jedem Fall klappen, und man hat dann auch direkt die Validierung mitgetestet.
 

DrPils

Bekanntes Mitglied
  • Überlege dir, welche Eingaben gültig sind und welche Antwort du dazu erwartest.
  • Überlege dir, welche Eingaben UNGÜLTIG sind und welche Antwort du dazu erwartest.
Genau das möchte ich nicht. Es geht nicht um die Validierungs regeln.

Ich möchte das Testen der Validierung gerne Trennen.

Mit Mockito sollte das schon irgendwie gehen

Dachte an sowas in der Richtung

Java:
@WebMvcTest(UserController.class)
class ControllerTest {
    @Autowired
    private MockMvc mockMvc;
    @Mock
    private Validator validator;


    @Test
    public void validation_gets_called() throws Exception {
        Object request = new Object();
        Set<ConstraintViolation<Object>> violations = mock(Set.class);
        when(validator.validate(request)).thenReturn(violations);

        // methoden aufruf

        verify(validator, times(1)).validate(request);
    }
}

Funktioniert aber so nicht, validate(..) wird nicht aufgerufen, obwohl wenn ich die app normal laufen lasse, ein Fehler geworfen wird
 

Marinek

Bekanntes Mitglied
Der normale Lebenszyklus würde je nachdem, welche Validierungsframework eingesetzt wird, beim ausführen eines Requests oder der Persistierung aufgerufen werden.

Du müsstest also den Dienst (Controller oder Repo) mocken und eine konkrete Implementierung eines DTO/ POJO/REC übergeben.
 

KonradN

Super-Moderator
Mitarbeiter
Also erst einmal den Ansatz beim Testen: Du testest ja lediglich Deinen Code. Und im Rahmen der Spring Boot Validation wird das vermutlich JRS 380 sein und Du hast eine @Validate Annotation wie in Validation in Spring Boot | Baeldung beschrieben?

Dann ist der Test doch lediglich, dass nicht valide Übergaben nicht übernommen werden. Und genau das wird durch die Tests, die in #2 beschrieben werden, auch getestet.

Dass Die Validierung selbst richtig ist, ist da nicht der Code, den Du testest. Unit Tests testen immer nur die Unit!

Das Andere wäre, dass Du die Entity, die irgendwelche Validierungs-Annotations hat, testen musst. Das ist aber dann ein Test der Entity und nicht der Test von irgendwelchen anderen Stellen. Und das kannst Du ja in dem Test für die Entity machen mit etwas wie:
Java:
    private Validator validator;

    @BeforeEach
    public void before() {
        validator = Validation.buildDefaultValidatorFactory().getValidator();
    }

    @Test
    public void testEntityNotValid() {
        MyEntity entiy = ......; // Create not valid Entity
        Set<ConstraintViolation<MyEntity>> actual = validator.validate(entity);
        assertThat(actual.iterator().next().getMessage()).isEqualTo("the given error message");
    }

Das einfach nur mal um es zu skizzieren.

Also der wichtige Punkt, den ich sehe: Überlege Dir, was Du wo testen willst. Und vermische es nicht! Das macht es nur komplexer als es sein muss wie dann die Idee von #5 zeigt (Ja, interessanter Weg @Apple’s Jünger - etwas in der Art würde theoretisch wohl gehen).

Das ist übrigens auch der Vorteil von TDD. Da kommst Du gar nicht erst zu diesen abstrusen Konstrukten! Du versuchst nicht erst, Dinge sonst wo zu testen, wo es nicht hin gehört und man schreibt nicht erst irgend welchen Code, der nicht testbar ist (hier jetzt weniger gegeben). Bei Dir wäre die Anforderung: Es gibt eine Entity und die hat diese Vorgaben bei der Validierung: ......
Und das setzt Du dann um indem Du Tests schreibst. Da gibt es also keinen Controller oder Repo oder sonst etwas. Da gibt es nur die Entity mit den Vorgaben und da sind die Annotations und diese testest Du.
(Und damit ist das auch ein super Ort, das mit Kommentaren zu versehen: Wieso gibt es diese fachlichen Anforderungen? Wenn Jemand sich dafür interessiert, dann schaut er den Test an und sieht: Da darf keine negative Zahl sein weil .... ==> Unit Tests als Dokumentation des Spezifikation. Deutlich einfacher als das separat schreiben zu wollen - was dann am Ende statt findet: "Wir müssen morgen liefern - schreib doch mal schnell die Spezifikation bis heute Abend." und dann kopiert man auf irgendwelchen Dokumenten schnell was zusammen und vergisst irgendwelche wichtigen Emails oder Jira Tickets oder oder oder ... Kommt das bekannt vor? :) )
 

DrPils

Bekanntes Mitglied
Also der wichtige Punkt, den ich sehe: Überlege Dir, was Du wo testen willst
Deswegen kam ich ja auf die Idee

Also mein Punkt wieso ich den aufruf der Validierung testen wollte ist folgender:

Der Controller soll nur Valide Objekte DTOs entgegen nehmen. Wie ein Valides DTO aussieht ist ja im DTO beschrieben. Der Controller prüft meines Verständnis nach nicht die Validierung, sondern gibt diese Validierung weiter. Wenn ich damit richtig liege, sollte in einem Unit Test des Controllers, nicht die Regeln der Validierung geprüft werden sondern ob diese stattfindet.
Die Validierungs Regel des Dto kann sich ja mal ändern, wieso muss ich dann den Controller Test anpassen.

ZB die post Methode ist so spezifiziert:
  • Darf nur valide request entgegen nehmen
  • Wenn invalides Request gibt er 400 mit den Validierungs verstossen zurück
  • Gibt den Request an den Service weiter
  • Wirft der Service eine Exception, gibt der Controller entsprechenden Status zurück
  • wenn der Service erfolgreich das Objekt verarbeitet hat gibt er einen 200 mit dem Ergebniss zurück
Sollte ich nicht genau das und nur das im Controller testen?
 

KonradN

Super-Moderator
Mitarbeiter
ok, dann haben wir die gleiche Sichtweise. Aber für Tests gilt ja durchaus auch das KISS Prinzip: keep it simple, stupid.

Das Problem, das due vermutlich siehst, ist: du brauchst ein nicht valides DTO für den Test. Und das gehört nicht wirklich in den Test des Controllers.

So aus dem Stehgreif würde ich sagen: Du hast ja ein DTOTest zum Test der Validierungen. Da kann also eine public static DTO createInvalidDTO Methode oder so sein und die wird dann aufgerufen.

(Wobei ich sowas gerne in Basis Klassen packe und dann so Methoden vererbe. Aber ob das hier passt, weiß ich nicht. Der Vorteil ist, dass die Erstellung der Instanzen dann so in allen Tests ist und die Abhängigkeit sauber ist. Da werden halt teilweise sogar eine Art Testumgebung aufgebaut für Business Tests …. Das ist teilweise einfacher als wirklich alles knallhart zu mocken - aber das ist eine Form der „Schlamperei“ daher das auf keinen Fall als Best Practice sehen!)
 

mrBrown

Super-Moderator
Mitarbeiter
Das würde ich schon nicht mehr als Unit-Test sehen, das Testen ja zum Teil (mindestens der Aufruf der Validierung) die Integration mit Spring.

Abgesehen davon sagst du ja schon selbst:
ZB die post Methode ist so spezifiziert:
  • Darf nur valide request entgegen nehmen
  • Wenn invalides Request gibt er 400 mit den Validierungs verstossen zurück
[....]
Sollte ich nicht genau das und nur das im Controller testen?

Ob eine Validierung aufgerufen wird, ist da nicht spezifiziert, nur wie auf valide und invalide Objekte reagiert wird. Je nachdem wie du den Controller aufbaust, kann man das auch ganze auch erstmal in einem Unit Test ohne durchgeführte Validierung testen (und die dann eben in einen Test auf höherer Ebene auslagern).
 
Ä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
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
R Spring Boot sql Beziehungen Frameworks - Spring, Play, Blade, Vaadin & Co 12
M Spring Boot 3 Datenbanken zur Laufzeit Verbinden Frameworks - Spring, Play, Blade, Vaadin & Co 5
ExceptionOfExpectation In Meiner Spring-Boot Applikation verlangt die Datenbank Wert für eine ID Frameworks - Spring, Play, Blade, Vaadin & Co 5
H Spring Boot Applikation und JHM Benchmark sowie ContextConfiguration in H2 Tests ich bekomme es nicht hin Frameworks - Spring, Play, Blade, Vaadin & Co 2
ExceptionOfExpectation Tests in Spring-Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
Avalon Get Request doppelt abfeuern ohne Post Redirect Get Pattern. Spring Boot Thymeleaf MVC Frameworks - Spring, Play, Blade, Vaadin & Co 12
thor_norsk Konfigurationsprobleme mit Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 9
R Spring Boot Integration-testing mit Keycloak Frameworks - Spring, Play, Blade, Vaadin & Co 1
R Spring Boot Integration-testing mit Keycloak Frameworks - Spring, Play, Blade, Vaadin & Co 13
thor_norsk Spring Boot Fehler Frameworks - Spring, Play, Blade, Vaadin & Co 1
thor_norsk Spring Boot und Docker Frameworks - Spring, Play, Blade, Vaadin & Co 5
K Spring Boot OneToMany Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 Spring Boot Docker Image erstellen und mit docker-compose konfigurieren Frameworks - Spring, Play, Blade, Vaadin & Co 1
gradlew.bat spring-boot:run funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 4
Zrebna Spring Boot/Thymeleaf: Bestätigungsemail senden. Frameworks - Spring, Play, Blade, Vaadin & Co 2
B Spring Boot und JPA Error creating bean Frameworks - Spring, Play, Blade, Vaadin & Co 24
R Spring Boot: Warum soll PasswordEncoder in einer neuen Methode definiert sein? Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Spring Boot und Microservices Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Spring Boot additional Datasource for a single entity Frameworks - Spring, Play, Blade, Vaadin & Co 0
Avalon Wie sieht bei Euch das Deployment einer Spring Boot Anwendung aus? Frameworks - Spring, Play, Blade, Vaadin & Co 4
M Threads in Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 7
W DI-Problem in Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
T Spring Boot: Was bewirkt parent in maven genau? Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Vaadin+Spring Boot erster Seitenload nach Neustart endlos Frameworks - Spring, Play, Blade, Vaadin & Co 0
doncarlito87 Wie erhalte ich ein JSON aus eine NativeQuery (Spring Boot)? Frameworks - Spring, Play, Blade, Vaadin & Co 8
Avalon @Query Select Abfrage liefert falsche Werte (Spring Boot, JPA, Hibernate) Frameworks - Spring, Play, Blade, Vaadin & Co 3
Avalon Erstellung Dockerimage mit spring-boot:build-image in Spring Boot mit Umgebungsvariablen Frameworks - Spring, Play, Blade, Vaadin & Co 0
D Spring Boot Field Injection in MapStruct Frameworks - Spring, Play, Blade, Vaadin & Co 5
OnDemand Spring Boot seltsame Logeinträge: Manipulationsversuche? Frameworks - Spring, Play, Blade, Vaadin & Co 2
D Spring Boot Mile Stone und Snapshot Versionen Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Spring Boot Exception Body Frameworks - Spring, Play, Blade, Vaadin & Co 2
N Spring Boot - Overkill für private Projekte? Frameworks - Spring, Play, Blade, Vaadin & Co 3
K Migration eines internen Frameworks zu Spring:Boot Frameworks - Spring, Play, Blade, Vaadin & Co 0
Z Hibernate & Postgres in Spring Boot (Syntaxprobleme) Frameworks - Spring, Play, Blade, Vaadin & Co 2
Z Spring Boot mit JPA;, Hibernate, Rest & Lombok Frameworks - Spring, Play, Blade, Vaadin & Co 8
OnDemand Spring Security/Boot/Vaadin Cookie Problem bei iFrame Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Spring Boot: Feld ignorieren Frameworks - Spring, Play, Blade, Vaadin & Co 3
N Buch zum Spring Framework bzw. Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 3
OnDemand Jasypt Spring Boot HIbernate wie komme ich an den Key? Frameworks - Spring, Play, Blade, Vaadin & Co 4
8u3631984 Spring Boot im Docker Container - Logback wird nicht verwendet Frameworks - Spring, Play, Blade, Vaadin & Co 13
sascha-sphw Spring Boot Resource Server (OAuth2) @MockMvc Frameworks - Spring, Play, Blade, Vaadin & Co 5
OnDemand Spring Boot CDN Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Spring Boot Deserialiserung mit JSON Frameworks - Spring, Play, Blade, Vaadin & Co 9
OnDemand Spring Boot POST zu PHP API Frameworks - Spring, Play, Blade, Vaadin & Co 12
OnDemand Spring Boot WebClient ErrorHandling Frameworks - Spring, Play, Blade, Vaadin & Co 5
8u3631984 Spring boot : Unique Constraint mit Many to Many Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Spring Boot Repository null Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Spring Boot Limits API calls Frameworks - Spring, Play, Blade, Vaadin & Co 20
J Spring boot mit Keyclaok rollen basiert Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Spring Boot Scheduler flexibel machen Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Spring Boot + Vaadin API Security Frameworks - Spring, Play, Blade, Vaadin & Co 1
S Spring Boot und seine Module verstehen Frameworks - Spring, Play, Blade, Vaadin & Co 3
R Architektur für Spring Boot Projekt Frameworks - Spring, Play, Blade, Vaadin & Co 5
M Spring Boot, Versionskontrolle und Entwicklungsumgebung und Deployment Frameworks - Spring, Play, Blade, Vaadin & Co 2
Avalon Image aus JSON Objekt im Browser anzeigen (BLOB, extrahieren, konvertieren) Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
Avalon CSS Datei wird in Spring Boot mit Thymeleaf im Standardordner nicht gefunden Frameworks - Spring, Play, Blade, Vaadin & Co 3
OnDemand Spring Boot Mapping null bei GET Aufruf Frameworks - Spring, Play, Blade, Vaadin & Co 8
J Spring Boot - Reactor Frameworks - Spring, Play, Blade, Vaadin & Co 1
L Spring Boot, H2 und Restschnittstelle synchonisation mit Client Frameworks - Spring, Play, Blade, Vaadin & Co 10
TonioTec Spring Boot Datenbankabfrage Frameworks - Spring, Play, Blade, Vaadin & Co 7
OnDemand Spring Boot encoding Slash in URL Parameter Frameworks - Spring, Play, Blade, Vaadin & Co 7
S Spring Boot startet nicht Frameworks - Spring, Play, Blade, Vaadin & Co 3
S Spring Boot -> War File | 404 in Tomcat Frameworks - Spring, Play, Blade, Vaadin & Co 20
LimDul Spring Boot Anwendung "automatisch" neustarten Frameworks - Spring, Play, Blade, Vaadin & Co 3
A Spring boot Frameworks - Spring, Play, Blade, Vaadin & Co 18
OnDemand DTO <> Entity Hibernate Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 28
OnDemand Verständnisfrage DTO Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 19
OnDemand Spring Boot Load Balancing Frameworks - Spring, Play, Blade, Vaadin & Co 5
S Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Spring Boot Threads Frameworks - Spring, Play, Blade, Vaadin & Co 6
S Spring Boot: Wert aus Config Datei ermitteln Frameworks - Spring, Play, Blade, Vaadin & Co 3
S Spring Boot: Ein geschütztes Verzeichnis Frameworks - Spring, Play, Blade, Vaadin & Co 1
bueseb84 Probleme mit Spring Boot Docker und Bootstrap Frameworks - Spring, Play, Blade, Vaadin & Co 9
OnDemand Spring Boot Eureka/Zuul Frameworks - Spring, Play, Blade, Vaadin & Co 0
F Redirect in einer Spring Boot WebApplication Frameworks - Spring, Play, Blade, Vaadin & Co 7
B Erstes Spring Boot Projekt: Gameserver-Manager Frameworks - Spring, Play, Blade, Vaadin & Co 5
V Spring Boot, thymeleaf, Eingaben cashen oder per session speichern? Frameworks - Spring, Play, Blade, Vaadin & Co 2
S Spring Boot Security Frameworks - Spring, Play, Blade, Vaadin & Co 3
S Spring Boot i18n Frameworks - Spring, Play, Blade, Vaadin & Co 28
bueseb84 Spring Boot : Update H2 Repository Frameworks - Spring, Play, Blade, Vaadin & Co 14
A Spring Boot/ OneToMany Relation Frameworks - Spring, Play, Blade, Vaadin & Co 29
S Spring Boot testen mit Service Klassen Frameworks - Spring, Play, Blade, Vaadin & Co 4
L Controller Spring Boot mit Java Frameworks - Spring, Play, Blade, Vaadin & Co 20
J Spring Boot H2 Datbase Frameworks - Spring, Play, Blade, Vaadin & Co 2
J Spring Boot Thymleaf mit Java.Optional Frameworks - Spring, Play, Blade, Vaadin & Co 0
L JavaFX Anwendung mit Spring Boot und mehrere FXML Forms Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Mit Maven (und Spring-boot) ein FatJAR und ein EAR bauen Frameworks - Spring, Play, Blade, Vaadin & Co 3
OnDemand Spring Boot Basic Authentication langsam Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Start Stop Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
H Spring Boot - Dependency Injection Frameworks - Spring, Play, Blade, Vaadin & Co 26
B Java Spring Boot - POM-Problem Frameworks - Spring, Play, Blade, Vaadin & Co 8
OnDemand Spring Boot parallele Requests Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Spring Boot Resttemplate exchange XML Frameworks - Spring, Play, Blade, Vaadin & Co 6
S Root-Pfad zu meiner Spring Boot Application Frameworks - Spring, Play, Blade, Vaadin & Co 3
OnDemand Spring Boot Error Logging Frameworks - Spring, Play, Blade, Vaadin & Co 5

Ähnliche Java Themen

Neue Themen


Oben