【问题标题】:Mockito Expect an ExceptionMockito 期待异常
【发布时间】:2015-02-24 09:53:54
【问题描述】:

我正在尝试使用 Mockito 和 Junit 测试以下方法:

@Transactional
@RequestMapping(method=RequestMethod.PUT,value ="/updateEmployer/{empId}")
public @ResponseBody Object updateEmployer(@PathVariable Integer empId,) throws Exception {

    Employee e = EmployeeRepository.findOne(empId);

    for (Department de : e.getDepartement()){
        de.setDepartmentName(e.getName + "_" + de.getName());       
    }
    EmployeeRepository..saveAndFlush(e);
    return null;
}   

这是测试方法:

@Test  // throw java.lang.NullPointerException
 public void updateEmployeeFailureTest() throws Exception {

        mockMvc.perform(
            MockMvcRequestBuilders
                    .put("/updateEmployer/{empId}",18)                      
                    .accept(MediaType.APPLICATION_JSON)).andDo(print())         

              .andExpect(MockMvcResultMatchers.view().name("errorPage"))
               .andExpect(MockMvcResultMatchers.model().attributeExists("exception"))
              .andExpect(MockMvcResultMatchers.forwardedUrl("/WEB-INF/jsp/errorPage.jsp"))
              .andExpect(MockMvcResultMatchers.status().isInternalServerError());       

    }   

打印堆栈:

 MockHttpServletRequest:
     HTTP Method = PUT
     Request URI = /updateEmployer/18
      Parameters = {}
         Headers = {Content-Type=[application/json], Accept=   application/json]}

         Handler:
            Type = com.controllers.employeeController
          Method = public java.lang.Object    com.controllers.employeeController.updateEmployer(java.lang.Integer) throws   java.lang.Exception

           Async:
      Was async started = false
      Async result = null

    Resolved Exception:
            ***Type = java.lang.NullPointerException***

    ModelAndView:
       View name = errorPage
            View = null
       Attribute = exception
           ***value = java.lang.NullPointerException***

         FlashMap:

  MockHttpServletResponse:
          Status = 500
   Error message = null
         Headers = {}
    Content type = null
            Body = 
   Forwarded URL = /WEB-INF/jsp/errorPage.jsp
  Redirected URL = null
         Cookies = []

这是可行的,但是当我尝试捕获此方法引发的文本或异常时
添加@Test (expected= java.lang.NullPointerException.class) 我有这个错误:

java.lang.AssertionError:预期异常:java.lang.NullPointerException

当我尝试将 nullPointerException Text 作为 ModelAndView 部分的属性(异常)的值时,我收到此错误:

java.lang.AssertionError:预期模型属性“异常”:java.lang.NullPointerException 但为:java.lang.NullPointerException

有没有办法使用 mockito (mockmvc) 预期抛出异常或值属性 (value = java.lang.NullPointerException) 或 Resolved Exception 部分中的文本?

任何帮助将不胜感激

【问题讨论】:

  • 当我尝试获取 nullPointerException Text 作为属性值(异常)时:你是怎么做到的?向我们展示代码。
  • 添加这样的期望:.andExpect(MockMvcResultMatchers.model().attribute("exception","java.lang.NullPointerException"));
  • Spring 不会像您的测试所期望的那样将字符串“java.lang.N‌​ullPointerException”存储在异常属性中。它存储了 NullPointerException 的 instance
  • 我试过这个:.andExpect(MockMvcResultMatchers.model().attribute("exception", java.lang.NullPointerException.class)) 我得到这个错误:java.lang.AssertionError: Model属性“异常”应为: 但为:。还尝试传递一个新的 NPE 实例(相同的断言错误)。那么,我应该写什么期望有这个实例?我想要一个实例或文本,但我不知道如何做到这一点。

标签: exception-handling mockito junit4 expect mockmvc


【解决方案1】:

你需要测试模型的exception属性是NullPointerException的一个实例。

这可以使用 Hamcrest 匹配器来完成:

 .andExpect(MockMvcResultMatchers.model().attribute(
     "exception", 
      Matchers.isA(NullPointerException.class))

【讨论】:

  • 谢谢,但现在我得到了这个错误:java.lang.AssertionError: Model attribute 'exception' expected: but was:。我在 javaDoc 中看到 IsA 方法总是返回 null。任何其他人的想法。
  • 要使用的 Matchers 类来自 hamcrest,而不是来自 Mockito:hamcrest.org/JavaHamcrest/javadoc/1.3/index.html?org/hamcrest/…
【解决方案2】:

更简单的解决方案是通过MvcResult 捕获exception,如下所示:

...
MvcResult result = mockMvc.perform(...)
        ...
        ...
        .andReturn();

assertThat(result.getResolvedException(), instanceOf(YourException.class));
assertThat(result.getResolvedException().getMessage(), is("Your exception message");
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多