我试图对Spring MVC控制器方法进行单元测试,但我的单元测试一直失败。
我有一个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
exception,指定上面带有空指针异常注释的行。
我已经试着用Mockito查找如何模拟类,我一直看到@mock
注释,我已经作为@mock DataUser
使用了注释(以及我在控制器方法中使用的其他类,我想我需要模拟它们)。
我如何让它工作?看起来我必须用假数据创建一个全新的DataUser
对象,但这似乎违背了模拟库的目的。如果我必须用假数据创建自己的对象,使用Mockito有什么意义?或者,由于缺乏经验,我可能会误解这一点。
请记住,在默认情况下,unsubbed方法在调用时返回返回类型的默认值(0表示数字,null表示对象)。
您还没有删除请求。getSession()
因此返回null。
您需要:
请求。getSession()
返回此模拟会话。getAttribute(“currentUser”)
除此之外:
虽然在测试中调用controller方法肯定有测试方法体的价值,但如果将测试重新实现为@WebMvcTest,您将测试更多功能(比如请求和响应序列化)
当使用mockito单元测试Spring mvc控制器时,如何注入道层对象。当使用SpringJUnit4ClassRunner类时,它总是使用@Spy注释给空指针异常。 示例代码: 在这个测试用例中,依次调用,它总是返回
正在使用Spring MVC创建Restful Web服务... 下面是我的pom.xml: WEB-INF/web.xml: web-inf/mvc-dispatcher-servlet.xml: src/main/resources/database_db.xml: @Repository public class UserDAO{ } SRC/Test/Java: 这就像在print()语句
> 解析某些文件的服务 管理文件系统的ServiceB 我想测试ControllerClass,特别是:
新的Spring靴。 控制器中的API看起来像, 测试用例看起来像, 现在,在运行测试用例(命令1)后,我得到了以下结果 “java.lang.AssertionError:预期状态: 但“命令2”如期成功。 我的问题是, RestController Prefix Path Controller Prefix Path=整个路径。 为了调用API,我们必须遵循上面的格式,但是如果遵循相同的内容,
我试图测试我的一个控制器,它返回给我一个get方法上的对象列表,以填充我页面上的下拉列表。 我试图使用MockMvc和Hamcrest编写一个JUnit测试来测试相同的内容。 我想比较对象列表,并测试它是否失败。 这就是我获取模型属性的方式: 提前谢了。
我正在使用Mockito编写一个JUnit测试用例,并得到一个NullPointerException。 在我的代码中是这样的: