我试图对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的意义何在?或者,我可能因为缺乏经验而误解了这一点。
1条答案
按热度按时间nfg76nw01#
记住,默认情况下,unsubbed方法在调用时返回返回类型的默认值(0表示数字,null表示对象)。
你还没被打呢
request.getSession()
所以它返回null。你需要:
为会话提供模拟
树桩
request.getSession()
归还这个假货树桩
session.getAttribute("currentUser")
除此之外:虽然在测试中调用controller方法肯定具有测试方法体的价值,但是如果将测试重新实现为@webmvctest,则将测试更多的功能(如请求和响应序列化)