【问题标题】:Cannot Set Mockito Value in Junit TestCase for Controller无法在控制器的 Junit 测试用例中设置模拟值
【发布时间】:2017-07-24 09:36:05
【问题描述】:

这是我的控制器类:

@RequestMapping(value="/administration", method=RequestMethod.GET)
public ModelAndView adminstrationPage(HttpServletRequest request){
    ModelAndView mv = new ModelAndView();
    mv.setViewName("administration");

    Optional<User> uo = userRepository.findOneByName(request.getUserPrincipal().getName());
    ... return mv;
}

这是我的 LoginControllerTest

    @InjectMocks
        LoginController loginController;

        @Mock
        private LoginService loginService;

        @Mock
        private UserRepository userRepository;

        @Mock
        User user;

        MockMvc mockMvc;
    @Test
        public void administartion() throws Exception{

Mockito.when(userRepository.findOneByName("test")).thenReturn(Optional.of(user));

            mockMvc.perform(get("/administration"))
            .andExpect(status().isOk());
        }

现在得到嵌套异常是 java.lang.NullPointerException。请帮帮我。

【问题讨论】:

标签: java junit mockito


【解决方案1】:

模拟用户存储库时,而不是userRepository.findOneByName("") 试试userRepository.findOneByName(anyString())。 并且不要忘记在 before 方法中初始化模拟,MockitoAnnotations.initMocks(this);

【讨论】:

  • 我已经检查了 userRepository.findOneByName(anyString()) 并使用了 MockitoAnnotations.initMocks(this);进入之前的方法,但仍然是同样的问题。 NullPointerException
【解决方案2】:
    user.setId(100000L);
    user.setName("testName");
    user.setEmail("testEmail@gmail.com");

由于user 是一个模拟,因此这些语句毫无用处。

要么创建一个真正的 User 对象(如果它是一个简单的 DTO,则首选该对象)或使用 when(user.getXXX()).thenhReturn(xxx)doReturn(xxx).when(user).getXXX(); 定义 user 模拟行为

【讨论】:

  • 我已经评论了这些行并再次检查,但仍然是 nullPointerException。有什么想法吗?
  • @Amit 评论 无用的行 并期待任何改变有什么意义?
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
相关资源
最近更新 更多