我是mockito/Java Spring的新手,我试图做一个测试。我有一个管理员控制器,其中包含此方法:
@RequestMapping(value="/admin/users", method = RequestMethod.GET)
public ResponseEntity<List<User>>users(){
List<User> students=this.userService.getAll();
if(students.isEmpty())
return new ResponseEntity<List<User>>(HttpStatus.NO_CONTENT);
return new ResponseEntity<List<User>>(students,HttpStatus.OK);
}
现在,我尝试进行测试,看看它是否有效,如下所示:
public class AdminControllerTest {
@InjectMocks
private AdminController controller;
@InjectMocks
private UserServiceImpl userService = new UserServiceImpl();
@Mock
private UserRepository userRepository;
private MockMvc mockMvc;
@Before
public void setup(){
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
@Test
public void test() throws Exception {
User user = new User();
user.setId(5);
user.setActive(true);
user.setLastName("Test1");
user.setName("Test1");
user.setPassword("123123");
user.setRole(User.Role.student);
user.setEmail("test@gmail.com");
when(userService.save(user)).thenReturn(user);
userService.save(user);
mockMvc.perform(get("/admin/users")).andDo(print());
}
}
问题是我不确定如何使 Test 类将项目添加到存储库。我尝试过这种方式,但我得到了空指针异常。我猜这是因为存储库是空的,当调用 .getAll(( 方法时它会返回错误。
由于您已经模拟了存储库,因此您无需将内容保存到其中。您需要做的就是指定调用某些方法时存储库将返回的内容。
而不是:
when(userService.save(user)).thenReturn(user);
。尝试使用:
when(userRepository.findAll()).thenReturn(Collections.singletonList(user));
为什么它不起作用
您获得 NullPointerException 的原因是以下原因之一:
- 您正在一个甚至不是模拟的对象上设置
when
,和/或 您没有为
userRepository.findAll()
方法提供when
,因此当您调用它时它返回 null:List<User> students=this.userService.getAll(); <-- returned null
。然后被取消引用并抛出 NPE:
if(students.isEmpty()) <-- throws NPE when students is null