Lors du test de la réponse API REST créée à l'aide de @RestController de Spring MVC à l'aide de MockMVC, utilisez AssertJ pour tester la réponse JSON.
Un mécanisme pour tester les requêtes et réponses HTTP au contrôleur sans démarrer le serveur fourni par Spring. Puisque le serveur n'est pas démarré lorsque le test est exécuté, il y a un avantage que la vitesse d'exécution du test est augmentée. Vous pouvez lancer le contexte de l'application Spring en utilisant @AutoConfigureMockMvc, qui vous permet de faire la DI comme vous le feriez lors du lancement de l'application entière.
Site de référence: [Testing the Web Layer](Class ContentResultMatchers)
Tester avec MockMVC + @ AutoConfigureMockMvc a l'avantage de pouvoir tester l'ensemble de l'application à grande vitesse, J'ai senti que le mécanisme de vérification du JSON renvoyé par RestController était faible. Il existe également une méthode pour comparer le JSON de la réponse avec le résultat attendu, mais vous devez transmettre le JSON du résultat attendu sous forme de chaîne de caractères.
Site de référence: Class ContentResultMatchers
Par exemple, envisagez de tester un RestContorller qui renvoie une liste de livres comme celle-ci:
Classe de réponse
Book.java
@Data
public class Book {
private int id;
private String name;
private String author;
}
Books.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Books {
private List<Book> books;
}
Classe de contrôleur
BookController
@RestController
public class BookController {
//Classe de service qui renvoie une liste de livres
private final BookService bookService;
@Autowired
public BookController(BookService bookService) {
this.bookService = bookService;
}
@GetMapping("books")
public Books get() {
//Obtenir et retourner la liste des livres avec service
return bookService.getBooks();
}
}
Dans la classe ContentResultMatchers, il existe une méthode publique ResultMatcher json (String jsonContent) pour vérifier JSON Il est préparé. Lorsque vous utilisez cette méthode json, transmettez la chaîne de caractères JSON du résultat attendu comme argument. Dans la méthode json, la chaîne transmise est convertie en objet JSON, puis comparée à la réponse du programme testé.
BookControllerTest
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class BookControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void test() throws Exception {
String expectedJson = "{books:[...]}"; //Créer JSON du résultat attendu sous forme de chaîne de caractères
mockMvc.perform(get("/books"))
.andExpect(status().isOk()) //Vérifiez le code d'état de la réponse
.andExpect(content().json(expectedJson)); //Vérifiez le JSON de la réponse
}
}
J'ai écrit un test avec la méthode json, mais j'ai pensé comme suit.
-S'il y a beaucoup d'éléments JSON, il est difficile de créer une chaîne de caractères JSON avec le résultat attendu. De plus, comme la complétion IDE ne fonctionne pas avec les chaînes de caractères, des fautes de frappe sont susceptibles de se produire. ↓ -Il semble qu'il y ait moins d'erreurs si vous créez un objet Java et le convertissez en chaîne de caractères avec Jackson. ↓ -Si vous créez un objet Java, n'est-il pas plus efficace de convertir les valeurs renvoyées par MockMVC en objets Java et de les comparer? N'est-il pas plus pratique d'utiliser AssertJ pour la comparaison entre les objets car il a plus de correspondance?
MockMVC fournit une méthode qui peut obtenir le corps de la réponse sous forme de chaîne de caractères, utilisez donc ceci. Convertissez la chaîne de caractères acquise en un objet avec Jackson et comparez-le au résultat attendu en utilisant AssertJ. Le code ressemble à ceci:
BookControllerTest
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class BookControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void test() throws Exception {
String responseJsonString = mockMvc.perform(get("/books"))
.andExpect(status().isOk())
.andReturn().getResponse().getContentAsString(); //Obtenir le corps de la réponse sous forme de chaîne
ObjectMapper objectMapper = new ObjectMapper();
//Convertir en objet Java dans Jackson
Books responseJson = objectMapper.readValue(responseJsonString, Books.class);
//Créer les résultats attendus avec des objets Java
Books expected = new Books(new ArrayList<>());
//Comparaison
assertThat(responseJson).isEqualTo(expected);
}
}
S'il est préférable d'utiliser la méthode json qui a été préparée à l'origine, cela dépend du contenu du JSON renvoyé par l'API cible, et je pense qu'il y a aussi une préférence. J'espère qu'il sera utile de savoir qu'il existe une telle méthode.
Recommended Posts