Java Mockito无法在RESTcontroller中更新/创建

Java Mockito无法在RESTcontroller中更新/创建,java,rest,testing,mockito,Java,Rest,Testing,Mockito,我正在尝试使用Mockito编写一些测试,我成功地为findAll和delete操作编写了它们,但是对于create和update,它们无法工作 @RunWith(MockitoJUnitRunner.class) public class RentedControllerTest { @Mock private RentedService rentalService; @Mock private MovieService movieService;

我正在尝试使用Mockito编写一些测试,我成功地为findAll和delete操作编写了它们,但是对于create和update,它们无法工作

@RunWith(MockitoJUnitRunner.class)
public class RentedControllerTest {

    @Mock
    private RentedService rentalService;

    @Mock
    private MovieService movieService;

    @Mock
    private ClientService clientService;

    @InjectMocks
    private RentedController rentalController;

    @InjectMocks
    private MovieController movieController;

    @InjectMocks
    private ClientController clientController;


    @Before
    public void setUp() throws Exception {
        initMocks(this);
    }

    @Test
    public void getMovies() throws Exception {
        List<Movie> movies = new ArrayList<>();
        movies.add(mock(Movie.class));
//        System.out.println(movies.toString());
        when(movieService.findAll()).thenReturn(movies);
////        System.out.println(movieService.findAll().toString());
        MoviesDto response = movieController.getMovies();
        assertEquals("should be 1 movie", 1, response.getMovies().size());
    }

    @Test
    public void updateMovie() throws Exception {
        Movie movie = new Movie(2,"Lotr",0, "dir2", 2003);
        MovieDto movieDto = mock(MovieDto.class);
        System.out.println(movie.toString());
        when(movieService.updateMovie(anyInt(), anyString(), anyInt(), anyString(), anyInt())).thenReturn(movie);
//        Movie m = new Movie();
//        m = movieService.updateMovie(2,"Lotrrrrr",0, "dir2", 2003);
//        System.out.println(m.toString());
        Map<String, MovieDto> map = movieController.updateMovie(2, movieDto);
        System.out.println(map.toString());
        assertEquals("Title should be Lots", "Lotr", map.get("movie").getName());
    }

    @Test
    public void createMovie() throws Exception {
        Movie movie = new Movie(2,"Lotr",0, "dir2", 2003);
        MovieDto movieDto = mock(MovieDto.class);
        when(movieService.createMovie(anyInt(), anyString(), anyInt(), anyString(), anyInt())).thenReturn(movie);
        Map<String, MovieDto> map = movieController.createMovie(movieDto);
        assertEquals("Title should be Lotr", "Lotr", map.get("movie").getName());
    }

    @Test
    public void deleteMovie() throws Exception {
        ResponseEntity response = movieController.deleteMovie(1);
        assertEquals("Http status should be OK", HttpStatus.OK, response.getStatusCode());
    }
}

如果findAll和delete工作正常,我真的不明白问题是什么。。。有什么想法吗?

似乎没有设置对MovieController的依赖关系

java.lang.NullPointerException
at ro.ubb.stcatalog.web.controller.MovieController.createMovie(MovieController.java:54)

我相信模仿
MovieDto
类会导致
NPE
,因为您的控制器希望DTO中存在一些参数,而这些参数不是由
mock()
设置的,例如
MovieDto.getMovie().getName()

使用所有必需的参数从头开始创建一个
MovieDto
对象,或者在模拟后设置参数,您应该可以

以下几点应该行得通

@Test
    public void updateMovie() throws Exception {
        Movie movie = new Movie(2,"Lotr",0, "dir2", 2003);
        MovieDto movieDto = mock(MovieDto.class);

        // Added the following line
        movieDto.setMovie(movie);

        System.out.println(movie.toString());
        when(movieService.updateMovie(anyInt(), anyString(), anyInt(), anyString(), anyInt())).thenReturn(movie);
        Map<String, MovieDto> map = movieController.updateMovie(2, movieDto);
        System.out.println(map.toString());
        assertEquals("Title should be Lots", "Lotr", map.get("movie").getName());
    }
@测试
public void updateMovie()引发异常{
电影=新电影(2,“Lotr”,0,“dir2”,2003);
MovieDto MovieDto=mock(MovieDto.class);
//添加了以下行
movieDto.setMovie(电影);
System.out.println(movie.toString());
当(movieService.updateMovie(anyInt(),anyString(),anyInt(),anyString(),anyInt())。然后返回(movie);
Map Map=movieController.updateMovie(2,movieDto);
System.out.println(map.toString());
assertEquals(“标题应该是Lots”、“Lotr”、map.get(“movie”).getName());
}

您需要先填充movieDto。当您在实际代码中执行get时,它就像您在一个null上执行get一样,该null给出了一个null指针。而且两个值应该相同。在when条件下,您告诉movieId为anyInt(),在实际的方法调用中,您给它的值为2。那不行。两者应如下所示

when(movieService.updateMovie(**2**, anyString(), anyInt(), anyString(), anyInt())).thenReturn(movie);
        Map<String, MovieDto> map = movieController.updateMovie(**2**, movieDto);
when(movieService.updateMovie(**2**,anyString(),anyInt(),anyString(),anyInt())。然后返回(movie);
Map Map=movieController.updateMovie(**2**,movieDto);

但movieController可用于其他操作,如delete和findAll…错误将我发送到控制器的movieService.update行。我使用调试器,但调试器失败了。。。但它应该给我发一部模拟电影。。。之前我用打印测试过,movieService的所有参数都是非空的-你可能需要在这里单步调试。我真的不明白。MovieDto只有一个参数,这就是电影。它也有默认值constructor@Melye77然后将movie对象设置为MovieDto对象,当前MovieDto对象中的movie对象要么为null,要么为空!我模拟了一部电影,而不是一部电影,并将模拟作为参数传递给了电影,就是这样。成功了。非常感谢。是的,我只是等了一会儿,因为时间太早了^^
java.lang.NullPointerException
at ro.ubb.stcatalog.web.controller.MovieController.createMovie(MovieController.java:54)
@Test
    public void updateMovie() throws Exception {
        Movie movie = new Movie(2,"Lotr",0, "dir2", 2003);
        MovieDto movieDto = mock(MovieDto.class);

        // Added the following line
        movieDto.setMovie(movie);

        System.out.println(movie.toString());
        when(movieService.updateMovie(anyInt(), anyString(), anyInt(), anyString(), anyInt())).thenReturn(movie);
        Map<String, MovieDto> map = movieController.updateMovie(2, movieDto);
        System.out.println(map.toString());
        assertEquals("Title should be Lots", "Lotr", map.get("movie").getName());
    }
when(movieService.updateMovie(**2**, anyString(), anyInt(), anyString(), anyInt())).thenReturn(movie);
        Map<String, MovieDto> map = movieController.updateMovie(**2**, movieDto);