[JAVA] So schreiben Sie einen Komponententest für Spring Boot 2

Einführung

Da ich mich entschlossen habe, einen Unit-Test mit Spring Boot2 zu schreiben, Ich werde den Schreibstil organisieren.

Wie schreibt man einen Test des in Model eingestellten Wertes? Ich hoffe, Sie können es verwenden, um sich in solchen Fällen zu erinnern.

Beispielcode finden Sie auf GitHub.

Antwortstatus-Test


import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

this.mockMvc.perform(get("/")).andDo(print())
        //Gibt an, ob der Status "200 OK" zurückgegeben werden soll.
        .andExpect(status().isOk())
        .andExpect(status().is(200))

Die Dokumentation sieht wie folgt aus (https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/result/StatusResultMatchers.html).

Sowohl isOk () als auch is (200) ergeben das gleiche Ergebnis.

Thymeleaf-Vorlagendatei

@Controller
@EnableAutoConfiguration
public class HomeController {
  @GetMapping(path = "/")
  String home(HttpServletRequest request, Model model) {
    // home.Geben Sie HTML an
    return "home";
  }
}

Mit diesem Gefühl geben Sie die Thymeleaf-Vorlagendatei zurück. Dies ist ein Test.

    //Prüfung
    this.mockMvc.perform(get("/")).andDo(print())
        //Gibt an, ob die Vorlage "home" zurückgegeben werden soll.
        .andExpect(view().name("home"))

Testen Sie mit der Namensmethode. Die Dokumentation ist hier.

Modelltest

Sie packen Daten mit dem Controller in das Modell.

MyData.java


public class MyData {
  private String strData;
  private int intData;

  public MyData(String strData, int intData) {
    this.strData = strData;
    this.intData = intData;
  }

  public void setStrData(String strData) {
    this.strData = strData;
  }
  public String getStrData() {
    return this.strData;
  }

  public void setIntData(int intData) {
    this.intData = intData;
  }
  public int getIntData() {
    return this.intData;
  }
}

HomeController.java


@Controller
@EnableAutoConfiguration
public class HomeController {
  @GetMapping(path = "/")
  String home(HttpServletRequest request, Model model) {

    // string
    model.addAttribute("test", "this is test");

    // HashMap<String, String>
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("name", "momotaro");
    map.put("age", "23");
    model.addAttribute("map", map);

    // List<String>
    List<String> list = new ArrayList<String>();
    list.add("list1");
    list.add("list2");
    list.add("list3");
    model.addAttribute("list", list);

    // List<MyData>
    List<MyData> list2 = new ArrayList<MyData>();
    list2.add(new MyData("test1", 111));
    list2.add(new MyData("test2", 222));
    model.addAttribute("list2", list2);

    // home.Geben Sie HTML an
    return "home";
  }
}

HomeControllerTest.java


@SpringBootTest(classes = HomeController.class)
@AutoConfigureMockMvc
public class HomeControllerTest {
  @Autowired
  private MockMvc mockMvc;

  @Test
Startbildschirm ungültig machen() throws Exception {

    HashMap<String, String> map = new HashMap<String, String>();
    map.put("name", "momotaro");
    map.put("age", "23");

    List<String> list = new ArrayList<String>();
    list.add("list1");
    list.add("list2");
    list.add("list3");

    List<MyData> list2 = new ArrayList<MyData>();
    list2.add(new MyData("test1", 111));
    list2.add(new MyData("test2", 222));


    //Prüfung
    this.mockMvc.perform(get("/")).andDo(print())
        //Gibt an, ob der Status "200 OK" zurückgegeben werden soll.
        .andExpect(status().isOk())
        .andExpect(status().is(200))

        //Gibt an, ob die Vorlage "home" zurückgegeben werden soll.
        .andExpect(view().name("home"))

        //Modelltest.

        //Zeichenfolgentyp
        .andExpect(model().attribute("test", "this is test"))

        //HashMap-Typ
        .andExpect(model().attribute("map", map))

        // List<String>Schimmel
        .andExpect(model().attribute("list", hasSize(3)))   //Listengröße
        .andExpect(model().attribute("list", hasItem("list1")))   //Ist list1 enthalten
        .andExpect(model().attribute("list", hasItem("list2")))   //Ist list2 enthalten
        .andExpect(model().attribute("list", hasItem("list3")))   //Ist list3 enthalten
        .andExpect(model().attribute("list", contains("list1", "list2", "list3")))  // list1, list2,Ist es in der Reihenfolge von list3 enthalten?
        .andExpect(model().attribute("list", is(list)))  //Ob es mit der Liste übereinstimmt

        // List<MyData>Schimmel
        .andExpect(model().attribute("list2", hasSize(2)))   //Listengröße
        .andExpect(model().attribute("list2",
          hasItem(allOf(hasProperty("strData", is("test1")), hasProperty("intData", is(111))))
        ))   //Ist diese Datenkombination enthalten?
        .andExpect(model().attribute("list2",
          hasItem(allOf(hasProperty("strData", is("test2")), hasProperty("intData", is(222))))
        ))   //Ist diese Datenkombination enthalten?
        //.andExpect(model().attribute("list2", is(list2)))  //Ob es mit list2 übereinstimmt->Diese Schreibweise ist nicht möglich. Ein Fehler wird auftreten.

        ;
  }
}

Sie können mit der Attributmethode wie folgt testen. Das Dokument ist hier

Testumleitung

Es wird durch POST-Verarbeitung umgeleitet.

HomeController.java


  @PostMapping(path = "/testpost")
  public ModelAndView testpost(RedirectAttributes redirectAttributes,  @RequestParam(value = "intvalue", required = false, defaultValue = "0") Integer intvalue) {
    ModelAndView modelAndView = new ModelAndView("redirect:/testget");

    //Eingabewert prüfen
    if (intvalue <= 0) {
      redirectAttributes.addFlashAttribute("error", "intvalue muss größer als 0 sein");
      return modelAndView;
    }
    //Daten einstellen
    modelAndView.addObject("value", intvalue);
    return modelAndView;
  }

HomeControllerTest.java


  @Test
  void testpost() throws Exception {
    //Wenn Sie den Parameter nicht übergeben, wird er bei der Prüfung abgefangen
    this.mockMvc.perform(post("/testpost")).andExpect(redirectedUrl("/testget"))
        .andExpect(flash().attribute("error", "intvalue muss größer als 0 sein"));

    //Bestehen Sie die Prüfung nach Übergabe der Parameter
    this.mockMvc.perform(post("/testpost").param("intvalue", "5"))
        .andExpect(redirectedUrl("/testget?value=5"));
  }

Verwenden Sie redirectedUrl (), um die Ziel-URL zu testen.

Verwenden Sie flash (), um redirectAttributes.addFlashAttribute () zu testen.

Die vom POST empfangenen Parameter können mit param () angegeben werden.

Testen Sie, ob eine bestimmte Methode mit einem bestimmten Argument aufgerufen wurde

Beim Empfang von POST auf dem Controller Ich denke, ich werde etwas dagegen tun. Dieser Test.

Hier DI einen bestimmten Service für Controller Testen wir den Aufruf der Servcie-Methode im Post-Prozess.

MyService.java


@Service
public class MyService {
  public void test(int value) {
    System.out.println("MyService.test()..." + value);
  }
}

HomeController.java



@Controller
@EnableAutoConfiguration
public class HomeController {

  @Autowired
  MyService myService;

  @PostMapping(path = "/testpost2")
  public String testpost2(@RequestParam(value = "intvalue", required = false, defaultValue = "0") Integer intvalue) {

    //MyService-Test()Anruf
    myService.test(intvalue);

    return "redirect:/";
  }
}

HomeControllerTest.java


@SpringBootTest(classes = HomeController.class)
@AutoConfigureMockMvc
public class HomeControllerTest {
  @Autowired
  private MockMvc mockMvc;

  @MockBean
  private MyService myService;

  @Test
  void testpos2() throws Exception {
    //redirectUrl check
    this.mockMvc.perform(post("/testpost2").param("intvalue", "5")).andExpect(redirectedUrl("/"));

    //MyService-Test()Testen Sie, ob die Methode mit einem Argumentwert von 5 aufgerufen wurde
    verify(this.myService, times(1)).test(5);
  }
}

verify(this.myService, times(1)).test(5);

Wenn du schreibst "Die Testmethode der MyService-Klasse wurde einmal mit einem Argumentwert von 5 aufgerufen." Es wird ein Test sein.

Der Test, um zu sehen, ob es zweimal aufgerufen wurde

verify(this.myService, times(2)).test(5);

Und

Wenn der Argumentwert 10 sein soll

verify(this.myService, times(1)).test(10);

Schreiben.

dadurch, Der Controller-Test Überprüfen des Werts des Parameters, um den Prozess zu isolieren, Übergabe von Parameterwerten an Funktionen anderer Dienste Ich denke, es kann auf zwei Arten eingegrenzt werden.

Test der Get-Parameter

Der Post-Parameter wurde in params () angegeben. Get-Parameter werden durch URL angegeben.

HomeController.java


  @GetMapping(path = "/testget")
  String testget(@RequestParam(value = "value", required = false, defaultValue = "0") Integer value, @ModelAttribute("error") String error, Model model) {

    model.addAttribute("strError", error);
    model.addAttribute("intValue", value);

    // testget.Geben Sie HTML an
    return "testget";
  }

HomeControllerTest.java


  @Test
  void testget() throws Exception {
    this.mockMvc.perform(get("/testget?value=5&error=SuperError")).andDo(print())
        //Gibt an, ob der Status "200 OK" zurückgegeben werden soll.
        .andExpect(status().isOk())

        //Gibt an, ob die Vorlage "testget" zurückgegeben werden soll.
        .andExpect(view().name("testget"))

        //Modelltest.
        .andExpect(model().attribute("intValue", 5))
        .andExpect(model().attribute("strError", "SuperError"))
        ;
  }

abschließend

Es ist immer noch ein Memo, als ich anfing, Tests mit Spring Boot zu schreiben Ich möchte weiterhin weitere hinzufügen.

Beispielcode finden Sie auf GitHub.

Ende.

Recommended Posts

So schreiben Sie einen Komponententest für Spring Boot 2
So führen Sie einen Komponententest für Spring AOP durch
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
Ich möchte einen Unit Test schreiben!
[SpringBoot] So schreiben Sie einen Controller-Test
So erstellen Sie mit SPRING INITIALIZR einen Hinadan für ein Spring Boot-Projekt
Beispielcode zum Testen eines Spring Boot-Controllers mit MockMvc
Schreiben wir einen Testcode für die Anmeldefunktion mit Spring Boot
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So stellen Sie Spring Boot Dependency Injection (DI) ein
[JUnit 5-kompatibel] Schreiben Sie einen Test mit JUnit 5 mit Spring Boot 2.2, 2.3
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[JUnit 5] Schreiben Sie einen Validierungstest mit Spring Boot! [Parametrisierungstest]
Dynamisches Schreiben iterativer Testfälle mit test / unit (Test :: Unit)
Schreiben Sie den Testcode mit Spring Boot
So stellen Sie Spring Boot + PostgreSQL ein
Verwenden Sie DBUnit für den Spring Boot-Test
Verwendung von ModelMapper (Spring Boot)
Verwenden Sie Spring Test + Mockito + JUnit 4 für Spring Boot + Spring Retry Unit Test
[Basic] So schreiben Sie ein Dockerfile Selbstlernend ②
[R Spec on Rails] So schreiben Sie Testcode für Anfänger von Anfängern
[Einführung in Java] So schreiben Sie ein Java-Programm
So erstellen Sie ein Maven-Repository für 2020
So schreiben Sie den Spring AOP Point Cut Specifier
So teilen Sie eine Spring Boot-Nachrichtendatei
[Rspec] Ablauf von der Einführung von Rspec bis zum Schreiben von Unit-Test-Code für das Modell
Schienen: Wie man eine Rechenaufgabe schön schreibt
[Java] So testen Sie, ob es in JUnit null ist
Informationen zum Entwerfen einer Spring Boot- und Unit-Test-Umgebung
So erstellen Sie überall eine H2-Datenbank
[Rails] Wie schreibe ich, wenn ich eine Unterabfrage mache?
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Verwendung des eingebauten h2db mit Federstiefel
So verkleinern Sie das Spring Boot Docker-Image
JUnit 5: Wie man Testfälle in enum schreibt
Verwendung von Spring Boot-Sitzungsattributen (@SessionAttributes)
So erstellen Sie Pagenationen für das "Kaminari" -Array
[Rails] So implementieren Sie einen Unit-Test eines Modells
So erstellen Sie eine leichte JRE für den Vertrieb
So schreiben Sie Testcode mit Basic-Zertifizierung
So binden Sie mit einer Eigenschaftendatei in Spring Boot
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
Spring Boot - So stellen Sie das Sitzungszeitlimit ein
Wie schreibe ich Rails
Anzeigen der in Spring Boot eingegebenen Zeichen im Browser und Referenzlinks [Einführung in Spring Boot / Für Anfänger]
Wie schreibe ich Docker-Compose
Wie schreibe ich Mockito
So schreiben Sie eine Migrationsdatei
[Spring Boot] So rufen Sie Eigenschaften dynamisch aus einer in einer URL enthaltenen Zeichenfolge ab
So führen Sie UT mit Excel als Testdaten mit Spring Boot + JUnit5 + DBUnit durch
Pläne zur Unterstützung von JDK 11 für Eclipse und Spring Boot
Einstellungen für die Verbindung zu MySQL mit Spring Boot + Spring JDBC
So verwenden Sie ein Array für den TreeMap-Schlüssel
So führen Sie mit RxAndroid einen Komponententest mit JVM an einer Quelle durch
Ein Memorandum über die Sucht nach Spring Boot2 x Doma2