当前位置: 首页 > 知识库问答 >
问题:

在尝试使用JUnit、Mockito测试Spring MVC控制器方法时,NullPointerExctive

池赞
2023-03-14

我试图对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.NullPointerExceptionexception,指定上面带有空指针异常注释的行。

我已经试着用Mockito查找如何模拟类,我一直看到@mock注释,我已经作为@mock DataUser使用了注释(以及我在控制器方法中使用的其他类,我想我需要模拟它们)。

我如何让它工作?看起来我必须用假数据创建一个全新的DataUser对象,但这似乎违背了模拟库的目的。如果我必须用假数据创建自己的对象,使用Mockito有什么意义?或者,由于缺乏经验,我可能会误解这一点。

共有1个答案

拓拔高畅
2023-03-14

请记住,在默认情况下,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。 在我的代码中是这样的: