Depuis que j'ai décidé d'écrire un test unitaire avec spring boot2, J'organiserai le style d'écriture.
Comment écrivez-vous un test de la valeur définie dans Model? J'espère que vous pourrez l'utiliser pour vous en souvenir dans de tels cas.
Un exemple de code est donné sur GitHub.
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
this.mockMvc.perform(get("/")).andDo(print())
//Renvoyer ou non le statut "200 OK"
.andExpect(status().isOk())
.andExpect(status().is(200))
La documentation ressemble à ici.
Les deux isOk () et is (200) donnent le même résultat.
@Controller
@EnableAutoConfiguration
public class HomeController {
@GetMapping(path = "/")
String home(HttpServletRequest request, Model model) {
// home.Spécifiez html
return "home";
}
}
Avec ce sentiment, vous retournerez le fichier de modèle de thymeleaf. C'est un test.
//tester
this.mockMvc.perform(get("/")).andDo(print())
//S'il faut renvoyer le modèle "à la maison"
.andExpect(view().name("home"))
Testez avec la méthode du nom. La documentation est ici.
Vous emballez les données dans le modèle avec le contrôleur.
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.Spécifiez html
return "home";
}
}
HomeControllerTest.java
@SpringBootTest(classes = HomeController.class)
@AutoConfigureMockMvc
public class HomeControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
écran d'accueil vide() 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));
//tester
this.mockMvc.perform(get("/")).andDo(print())
//Renvoyer ou non le statut "200 OK"
.andExpect(status().isOk())
.andExpect(status().is(200))
//S'il faut renvoyer le modèle "à la maison"
.andExpect(view().name("home"))
//Test de modèle.
//type de chaîne
.andExpect(model().attribute("test", "this is test"))
//Type de HashMap
.andExpect(model().attribute("map", map))
// List<String>Moule
.andExpect(model().attribute("list", hasSize(3))) //Taille de la liste
.andExpect(model().attribute("list", hasItem("list1"))) //Est-ce que list1 est inclus
.andExpect(model().attribute("list", hasItem("list2"))) //Est-ce que list2 est inclus
.andExpect(model().attribute("list", hasItem("list3"))) //Est-ce que list3 est inclus
.andExpect(model().attribute("list", contains("list1", "list2", "list3"))) // list1, list2,Est-il inclus dans l'ordre de list3?
.andExpect(model().attribute("list", is(list))) //S'il correspond à la liste
// List<MyData>Moule
.andExpect(model().attribute("list2", hasSize(2))) //Taille de la liste
.andExpect(model().attribute("list2",
hasItem(allOf(hasProperty("strData", is("test1")), hasProperty("intData", is(111))))
)) //Cette combinaison de données est-elle incluse?
.andExpect(model().attribute("list2",
hasItem(allOf(hasProperty("strData", is("test2")), hasProperty("intData", is(222))))
)) //Cette combinaison de données est-elle incluse?
//.andExpect(model().attribute("list2", is(list2))) //S'il correspond à list2->Cette façon d'écrire n'est pas possible. Une erreur se produira.
;
}
}
Vous pouvez tester avec la méthode d'attribut comme ceci. Le document est ici
Il sera redirigé par le traitement POST.
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");
//Vérifier la valeur d'entrée
if (intvalue <= 0) {
redirectAttributes.addFlashAttribute("error", "intvalue doit être supérieur à 0");
return modelAndView;
}
//Définir les données
modelAndView.addObject("value", intvalue);
return modelAndView;
}
HomeControllerTest.java
@Test
void testpost() throws Exception {
//Si vous ne passez pas le paramètre, il sera pris dans la vérification
this.mockMvc.perform(post("/testpost")).andExpect(redirectedUrl("/testget"))
.andExpect(flash().attribute("error", "intvalue doit être supérieur à 0"));
//Passer le contrôle après avoir passé les paramètres
this.mockMvc.perform(post("/testpost").param("intvalue", "5"))
.andExpect(redirectedUrl("/testget?value=5"));
}
Utilisez redirectedUrl () pour tester l'URL de destination.
Utilisez flash () pour tester redirectAttributes.addFlashAttribute ().
Les paramètres reçus par POST peuvent être spécifiés par param ().
Lors de la réception du POST sur le contrôleur Je pense que je vais faire quelque chose à ce sujet. Ce test.
Ici, DI un service spécifique au contrôleur Testons l'appel de la méthode Servcie dans le processus Post.
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) {
//Test MyService()Appel
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 vérification
this.mockMvc.perform(post("/testpost2").param("intvalue", "5")).andExpect(redirectedUrl("/"));
//Test MyService()Teste si la méthode a été appelée avec une valeur d'argument de 5
verify(this.myService, times(1)).test(5);
}
}
verify(this.myService, times(1)).test(5);
Si vous écrivez "La méthode de test de la classe MyService a été appelée une fois avec une valeur d'argument de 5" Ce sera un test.
Le test pour voir s'il a été appelé deux fois
verify(this.myService, times(2)).test(5);
Et
Lorsque vous voulez que la valeur de l'argument soit 10
verify(this.myService, times(1)).test(10);
Écrire.
par ça, Le test du contrôleur Vérification de la valeur du paramètre pour isoler le processus, Passer des valeurs de paramètres à des fonctions d'autres services Je pense que cela peut être réduit à deux types.
Les paramètres Post ont été spécifiés dans params (), Les paramètres Get sont spécifiés par URL.
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.Spécifiez html
return "testget";
}
HomeControllerTest.java
@Test
void testget() throws Exception {
this.mockMvc.perform(get("/testget?value=5&error=SuperError")).andDo(print())
//Renvoyer ou non le statut "200 OK"
.andExpect(status().isOk())
//S'il faut renvoyer le modèle "testget"
.andExpect(view().name("testget"))
//Test de modèle.
.andExpect(model().attribute("intValue", 5))
.andExpect(model().attribute("strError", "SuperError"))
;
}
C'est toujours un mémo quand j'ai commencé à écrire des tests avec Spring Boot, donc Je voudrais continuer à en ajouter.
Un exemple de code est donné sur GitHub.
fin.
Recommended Posts