Mockito Ожидайте исключения

Я пытаюсь проверить метод ниже с 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:

@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 (ожидаемый = java.lang.NullPointerException.class), у меня возникает эта ошибка:

java.lang.AssertionError: Ожидаемое исключение: java.lang.NullPointerException

когда я пытаюсь получить текст nullPointerException как значение атрибута (исключения) раздела ModelAndView, я получаю эту ошибку:

java.lang.AssertionError: Ожидалось исключение атрибута модели: java.lang.NullPointerException, но было: java.lang.NullPointerException

Есть ли способ ожидать возникновения исключения или текста в атрибуте значения ( value = java.lang.NullPointerException) или текста в разделе разрешенного исключения с использованием mockito (mockmvc)?

Любая помощь будет высоко ценится


person Alex2330    schedule 24.02.2015    source источник
comment
когда я пытаюсь получить текст nullPointerException как значение атрибута (исключение): как вы это делаете? Покажите нам код.   -  person JB Nizet    schedule 24.02.2015
comment
Добавление такого ожидания: .andExpect(MockMvcResultMatchers.model().attribute(exception,java.lang.NullPointerException));   -  person Alex2330    schedule 24.02.2015
comment
Spring не сохраняет String java.lang.N‌​ullPointerException, как ожидает ваш тест, в атрибуте исключения. Он хранит экземпляр исключения NullPointerException.   -  person JB Nizet    schedule 24.02.2015
comment
Я пробовал это: .andExpect(MockMvcResultMatchers.model().attribute(exception, java.lang.NullPointerException.class)) и получаю эту ошибку: java.lang.AssertionError: Ожидается исключение атрибута модели:‹class java. lang.NullPointerException›, но было:‹java.lang.NullPointerException›. Попытался также передать новый экземпляр NPE (та же ошибка утверждения). Итак, какие ожидания я должен написать, что у меня есть этот экземпляр? я хочу иметь экземпляр или текст, но я понятия не имею, как это сделать.   -  person Alex2330    schedule 24.02.2015


Ответы (2)


Вам нужно проверить, что атрибут exception модели является экземпляром NullPointerException.

Это можно сделать с помощью сопоставителя Hamcrest:

 .andExpect(MockMvcResultMatchers.model().attribute(
     "exception", 
      Matchers.isA(NullPointerException.class))
person JB Nizet    schedule 24.02.2015
comment
Спасибо, но теперь я получил эту ошибку: java.lang.AssertionError: Ожидалось исключение атрибута модели: «null», но было: «java.lang.NullPointerException». Я видел в javaDoc, что метод IsA всегда возвращает значение null. Любые другие идеи. - person Alex2330; 24.02.2015
comment
Используемый класс Matchers принадлежит hamcrest, а не Mockito: hamcrest.org/JavaHamcrest/javadoc/1.3/index.html?org/hamcrest/ - person JB Nizet; 24.02.2015

Более простым решением было бы поймать exception через MvcResult, например:

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

assertThat(result.getResolvedException(), instanceOf(YourException.class));
assertThat(result.getResolvedException().getMessage(), is("Your exception message");
...
person Rogério Ramos    schedule 24.05.2017