MockMVC con un @Query en mi repositorio o refactorizar mi controlador para no usarlo?

Jamie:

Tengo un @Query en mi repositorio que vuelvo a mi controlador de datos basado en una consulta SQL, ¿cómo iba a burlarse de esto?

Aquí está mi repositorio

package movieweb.movies.repository;

import movieweb.movies.models.UserMovies;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserMoviesRepository extends CrudRepository<UserMovies, Integer> {

    @Query(value = "select * from movies, user_movies where movies.movie_id = user_movies.movie_id and uname = ?1", nativeQuery = true)
    List<UserMovies> findByUname(String uname);
}

Aquí está mi controlador

package movieweb.movies.controllers;

import movieweb.movies.models.Movies;
import movieweb.movies.models.UserMovies;
import movieweb.movies.repository.UserMoviesRepository;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.Query;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class UserMoviesController {

    @Autowired
    private UserMoviesRepository umRepository;

    @CrossOrigin
    @PostMapping(path = "/newUserMovie")
    public ResponseEntity<UserMovies> addNewUserMovie(@RequestBody UserMovies data){
          umRepository.save(data);
        return new ResponseEntity<UserMovies>(data, HttpStatus.CREATED);

    }

    @CrossOrigin
    @GetMapping(path="/getUserMovies")
    public  List<UserMovies> getUsersMovies(){
        return (List<UserMovies>) umRepository.findAll();
    }

    @CrossOrigin
    @GetMapping(path = "/getUserMovies/{uname}")
    public  List<UserMovies> getUserMovies(@PathVariable String uname){
        return umRepository.findByUname(uname);
    }

    @CrossOrigin
    @DeleteMapping(path ="/deleteUserMovies/{id}")
    ResponseEntity deleteUserMovie(@PathVariable Integer id) {
        umRepository.deleteById(id);
        return new ResponseEntity(HttpStatus.ACCEPTED);
    }

    @CrossOrigin
    @PutMapping("/usermovie/update/{id}")
    public ResponseEntity<UserMovies> updateMovie(@RequestBody UserMovies updateMovie, @PathVariable Integer id) {
       return umRepository.findById(id)
                .map(userMovies -> {
                    userMovies.setMovieId(updateMovie.getMovieId());
                    userMovies.setUname(updateMovie.getUname());
                     umRepository.save(userMovies);
                    return new ResponseEntity<UserMovies>(userMovies, HttpStatus.OK);

                })
                .orElseGet(() -> {
                    updateMovie.setMovieId(id);
                     umRepository.save(updateMovie);
                    return new ResponseEntity<UserMovies>(updateMovie, HttpStatus.OK);
                });
    }

}

Y esto es lo que estoy tratando de hacer en mi prueba

@Test
    void getUserMoviesPerUser() throws Exception{
        ArrayList<UserMovies> userMovies = new ArrayList<>();
        userMovies.add(new UserMovies(1, "jamie", 1));
        userMovies.add(new UserMovies(2, "joe", 1));
        userMovies.add(new UserMovies(3, "jamie", 2));
        userMovies.add(new UserMovies(4, "joe", 2));

        when(userMoviesRepository.findByUname("jamie")).thenReturn(userMovies);
        mockMvc.perform(get("/getUserMovies/{uname}", "jamie"))
                .andDo(print())
                .andExpect(jsonPath("$", hasSize(2)))
                .andExpect(jsonPath("$[0].userMovieID", is(1)))
                .andExpect(jsonPath("$[0].uname", is("jamie")))
                .andExpect(jsonPath("$[0].movieId", is(1)))
                .andExpect(jsonPath("$[1].userMovieID", is(3)))
                .andExpect(jsonPath("$[1].uname", is("jamie")))
                .andExpect(jsonPath("$[1].movieId", is(1)));

        Mockito.verify(userMoviesRepository, times(1)).findAll();
    }

El problema que estoy enfrentando es cuando ejecuto la prueba anterior no estoy recibiendo de vuelta a sólo 2 discos como yo esperaría, regrese 4. Esto tiene sentido en el hecho de que yo puedo dependen de SQL para ejecutar las pruebas. ¿Hay una mejor manera de escribir mi controlador para obtener los datos basados ​​en movie_id?

Jonathan JOhx:

En su código va a crear 4 recordspor burlarse continuación, basta con quitar 2 of thempara que tenga 2 recordscomo respuesta.

@Test
void getUserMoviesPerUser() throws Exception{
    ArrayList<UserMovies> userMovies = new ArrayList<>();
    userMovies.add(new UserMovies(1, "jamie", 1));
    userMovies.add(new UserMovies(2, "joe", 1));

    when(userMoviesRepository.findByUname("jamie")).thenReturn(userMovies);
    mockMvc.perform(get("/getUserMovies/{uname}", "jamie"))
            .andDo(print())
            .andExpect(jsonPath("$", hasSize(2)))
            .andExpect(jsonPath("$[0].userMovieID", is(1)))
            .andExpect(jsonPath("$[0].uname", is("jamie")))
            .andExpect(jsonPath("$[0].movieId", is(1)))
            .andExpect(jsonPath("$[1].userMovieID", is(3)))
            .andExpect(jsonPath("$[1].uname", is("jamie")))
            .andExpect(jsonPath("$[1].movieId", is(1)));

    Mockito.verify(userMoviesRepository, times(1)).findAll();
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=292823&siteId=1
Recomendado
Clasificación