[JAVA] Frühlingstest zur Überprüfung einzelner Artikel

Einführung

Möglicherweise wird die Funktionsprüfung der Einzelelementvalidierung angezeigt, z. B. die im Test von "Controller" geschriebene Klasse "Form". Der "Controller" -Test wird oft im Voraus geschrieben, und wenn es viele Testmuster gibt, wird die Testklasse groß und die Lesbarkeit verschlechtert sich.

Das Schreiben als Test der Klasse "Form" reduziert die Codemenge und macht den Testinhalt klar.

Unten bestätigt mit Spring Boot 2.0.5.

Getestete Klasse

Testen Sie die Validierung der folgenden "UserForm" -Klasse.

import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Data
public class UserForm {

    @NotNull
    private Integer userId;

    @Size(max = 2)
    @NotBlank
    private String userName;

}

** Validierung ** Implementieren Sie die folgende Validierung mit Anmerkungen in jedem Feld.

Testklasse

Erstellt als Testklasse für die UserForm-Klasse.

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator;

import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;


@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UserFormTest {

    @Autowired
    Validator validator;

    private UserForm userForm = new UserForm();
    private BindingResult bindingResult = new BindException(userForm, "UserForm");

    @Before
    public void before() {
        userForm.setUserId(1);
        userForm.setUserName("Ryu-bi");
    }

    /**
     *Kein Fehler
     */
    @Test
    public void noError() {
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError(), is(nullValue()));
    }

    /**
     *userId ist null
     */
    @Test
    public void userIdIsNull() {
        userForm.setUserId(null);
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError().getField(), is("userId"));
        assertThat(bindingResult.getFieldError().getDefaultMessage(), is("must not be null"));
    }

    /**
     *Die Größe von userName überschreitet die Obergrenze
     */
    @Test
    public void userNameSizeIsOverLimit() {
        userForm.setUserName("Sommer Hou");
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError().getField(), is("userName"));
        assertThat(bindingResult.getFieldError().getDefaultMessage(), is("size must be between 0 and 2"));
    }

    /**
     *Benutzername ist null
     */
    @Test
    public void userNameIsNull() {
        userForm.setUserName(null);
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError().getField(), is("userName"));
        assertThat(bindingResult.getFieldError().getDefaultMessage(), is("must not be blank"));
    }

    /**
     *Benutzername ist leer
     */
    @Test
    public void userNameIsBlank() {
        userForm.setUserName("");
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError().getField(), is("userName"));
        assertThat(bindingResult.getFieldError().getDefaultMessage(), is("must not be blank"));
    }

    /**
     *Benutzername ist nur ein Leerzeichen mit halber Breite
     */
    @Test
    public void userNameIsOnlySpace() {
        userForm.setUserName("  ");
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError().getField(), is("userName"));
        assertThat(bindingResult.getFieldError().getDefaultMessage(), is("must not be blank"));
    }
}

Sie können die Validierung durchführen, indem Sie "org.springframework.validation.Validator" an "@ Autowired" übergeben und "userForm" und "bindingResult" an die "validate" -Methode übergeben. Das Validierungsergebnis befindet sich in "bindingResult", sodass Sie den Inhalt bestätigen können.

Was das Schreiben einer Testmethode angeht, denke ich, dass es gut ist, einen normalen Systemzustand mit "vorher" zu erstellen und mit jeder Testmethode nur einen Teil in ein abnormales System umzuwandeln und zu testen. ..

Ergänzung

Auf die Frage, ob der "Controller" -Test überhaupt nicht erforderlich ist, weil die "Form" -Klasse einen Ein-Term-Validierungstest durchführen kann, konvertiert der "Controller" beispielsweise die Fehlermeldung oder die "Form" -Klasse wird zuerst validiert. Wenn Sie überprüfen möchten, ob dies der Fall ist, müssen Sie mit Controller testen.

Da jedoch umfassende Tests durch Testen der Klasse "Form" unterdrückt werden können, besteht kein Zweifel daran, dass die Anzahl der Testmuster in "Controller" verringert werden kann.

Recommended Posts

Frühlingstest zur Überprüfung einzelner Artikel
Formularklassenvalidierungstest mit Spring Boot
Selbstgemachte Validierung mit Spring
[JUnit 5] Schreiben Sie einen Validierungstest mit Spring Boot! [Parametrisierungstest]
Federvalidierung und Fehlercode
Spring Security-Verwendungsnotiztest
Ändern Sie die Spring Boot-Validierungsnachricht
So führen Sie einen Komponententest für Spring AOP durch
Schreiben Sie den Testcode mit Spring Boot
Erhalten Sie Validierungsergebnisse mit Spring Boot
Verwenden Sie DBUnit für den Spring Boot-Test
Testen Sie den Spring Framework Controller mit Junit
Über Fehler bei der Implementierung der Federvalidierung