nullpointerexception在尝试用junit测试SpringMVC控制器方法时,mockito

zkure5ic  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(364)

我试图对springmvc控制器方法进行单元测试,但是我的单元测试一直失败。
我有一个spring mvc控制器方法:

// MyController.java
@RequestMapping(value = "/end-point", method = RequestMethod.GET)
public ModelAndView getData(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    ModelAndView mv = new ModelAndView();
    DataManager dataManager = DataManager.getInstance();
    DataUser currentUser = (DataUser) request.getSession().getAttribute("currentUser");
    List<DataItem> dataList = dataManager.getDataForUser(currentUser.getId());
    mv.addObject("dataList", dataList);
    mv.setViewName("home-page");
    return mv;
}

我正在尝试用junit测试这个控制器方法。我很少有单元测试的经验,正在努力学习。似乎这几乎是不可能的,或者没有一个mocking库是没有意义的,我正在工作的项目已经有mockito作为一个依赖项,所以我正在尝试使用它。我的测试课程如下:

//MyControllerTest.java
public class MyControllerTest {
    @InjectMocks
    private MyController myController;

    @Mock
    HttpServletRequest request;

    @Mock
    HttpServletResponse response;

    @Mock
    ModelAndView mockModelAndView;

    @Mock
    DataManager mockDataManager;

    @Mock
    DataUser mockDataUser;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void getDataTest() throws Exception {
        //I guess I have to somehow mock mockDataUser here even more than @Mock???
        Mockito.when(request.getSession().getAttribute("currentUser")).thenReturn(mockVendorUser); // <-- this is where the null pointer exception is coming from
        Mockito.when(myController.getData(request, response)).thenReturn(mockModelAndView); 
        ModelAndView testing = profileControllerWH.getMySkus(request, response);
        assertEquals(1, 1);
    }
}

当我运行测试时,它失败了,我得到了一个 java.lang.NullPointerException 控制台中的异常,使用空指针异常注解指定上面的行。
我试着查找如何用mockito模拟类,我一直看到 @Mock 注解,我已经有了 @Mock DataUser (以及我在controller方法中使用的其他类,我想我需要模拟这些类)。
我怎样才能让它工作?好像我要创造一个全新的世界 DataUser 对象,但这似乎违背了模拟库的目的。如果我必须用假数据创建自己的对象,那么使用mockito的意义何在?或者,我可能因为缺乏经验而误解了这一点。

nfg76nw0

nfg76nw01#

记住,默认情况下,unsubbed方法在调用时返回返回类型的默认值(0表示数字,null表示对象)。
你还没被打呢 request.getSession() 所以它返回null。
你需要:
为会话提供模拟
树桩 request.getSession() 归还这个假货
树桩 session.getAttribute("currentUser") 除此之外:
虽然在测试中调用controller方法肯定具有测试方法体的价值,但是如果将测试重新实现为@webmvctest,则将测试更多的功能(如请求和响应序列化)

相关问题