Java Mockito无法在RESTcontroller中更新/创建
我正在尝试使用Mockito编写一些测试,我成功地为findAll和delete操作编写了它们,但是对于create和update,它们无法工作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;
@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);