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.
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.
@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.
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
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.
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.
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"))
;
}
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