Aller au contenu

Exemple de test d’un Contrôleur de l’application Back Cinema

Contrôleur

//@RunWith(SpringRunner.class) // avec JUnit4
@ExtendWith(SpringExtension.class) // avec Junit 5
@SpringBootTest
@ContextConfiguration
@AutoConfigureMockMvc
public class MovieControllerTest {

	@Autowired
	MockMvc mockMvc;
		
	@Autowired // il va convertir nos données en JSON lorsque nous voulons invoquer notre API
	//comme le ferait par exemple un client JavaScript.
	private ObjectMapper objectMapper;

	JacksonTester<Movie> movieJacksonTester;
	
	@MockBean // Les mocks vont être créés par spring-boot-test qui apporte une encapsulation de Mockito
	MovieService movieService;
	
	@MockBean // Les mocks vont être créés par spring-boot-test qui apporte une encapsulation de Mockito
	CategoryService categoryService;

	@BeforeEach
	public void setUp() {
		JacksonTester.initFields(this, objectMapper);
	}


	@Test
	@DisplayName("Test : Tous les Movies sont retournés")
	@WithMockUser(username="pbouget", roles={"ADMIN", "CREATOR","READER"})
//	@WithAnonymousUser
	public void getAllMovies() throws Exception {
		
		when(this.movieService.findAllMovies()).thenReturn(new ArrayList<Movie>()); // on retourne la liste
		this.mockMvc.perform(get("/api/movie/all")).andExpect(status().isOk());
	}
	
	
	@Test
	@DisplayName("Test : Tous les Movies ne sont pas retournés")
	@WithMockUser(username="pbouget", roles={"ADMIN", "CREATOR","READER"})
	public void getMoviesNotFound() throws Exception {
		when(this.movieService.findAllMovies()).thenReturn(null); // on ne retourne rien
		this.mockMvc.perform(get("/api/movie")).andExpect(status().isNotFound());
	}
	
	@Test
	@DisplayName("Test : création d'un Movie")
	@WithMockUser(username="pbouget", roles={"ADMIN", "CREATOR","READER"})
	public void createMovie() throws Exception {
		Category category = categoryService.createNewCategory(new Category("Film culte"));
		Movie movie = new Movie("Dikkenek", 92, category);
		
		when(this.movieService.createNewMovie((Movie) (any()))).thenReturn(movie);

		this.mockMvc.perform(post("/api/movie/add")
				.contentType(MediaType.APPLICATION_JSON)
				.content(objectMapper.writeValueAsString(movie)))
				.andExpect(status().isOk())
				.andExpect(jsonPath("name").value("Dikkenek"))
				.andExpect(jsonPath("duration").value("92"));
//				.andExpect(jsonPath("movie.category.name").value("Film culte"));
//				.andExpect(jsonPath("category.name").value("Film culte"));
		
	}
	
	@Test
	@DisplayName("Test : La création de Movie retourne null")
	@WithMockUser(username="pbouget", roles={"ADMIN", "CREATOR","READER"})
	public void createMovieReturnNull() throws Exception {
		when(this.movieService.createNewMovie((Movie) any())).thenReturn(null);
		this.mockMvc.perform(post("/api/movie")
				.content(""))
				.andReturn();
	}
	
	@Test
	@DisplayName("Test : Destruction d'un Movie introuvable")
	@WithMockUser(username="pbouget", roles={"ADMIN", "CREATOR","READER"})
	public void deleteMovieNotFound() throws Exception {
		
	//	doNothing().when(this.movieService).deleteMovie(9L);
	
		this.mockMvc.perform(delete("/api/movie/9"))
				.andExpect(status()
				.isNotFound());
	}
	
}

Résultats avec lancement de JUnit

exemple

Lien vers la documentation Spring sur l’utilisation des Mocks…

en anglais

en français