Mockito 和 Java Spring - 测试中的存储库



我是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 的原因是以下原因之一:

  1. 您正在一个甚至不是模拟的对象上设置when,和/或
  2. 您没有为 userRepository.findAll() 方法提供when,因此当您调用它时它返回 null:

    List<User> students=this.userService.getAll(); <-- returned null
    

    。然后被取消引用并抛出 NPE:

    if(students.isEmpty()) <-- throws NPE when students is null
    

相关内容

  • 没有找到相关文章

最新更新