2015-11-05 1 views
1

Я тестирую свой Spring @RestController, используя автономную настройку, и высмеивая некоторые автообученные бобы с использованием mockito, до сих пор все мои тесты были успешными, пока я не попытаюсь протестировать этот сервис rests:Nullpointer на HttpServletResponse ответ с использованием теста SpringFramework и Mockito

@RequestMapping(value = "/some/{someId}/other/someagain", method = RequestMethod.POST) 
public FileSystemResource downloadInvoiceQuery(@PathVariable Long someId, 
     @RequestBody SomeClass request, HttpServletResponse response) { 
. 
. 
. 
mockedBean.method("object1","object2"); 
response.setHeader("some headers"); 
} 

с помощью этого теста:

when(mockedBean.method(any(), any())).thenReturn(null); 

mockMvc.perform(MockMvcRequestBuilders.post("/some/{someId}/other/someagain", 1L) 
.contentType(MediaType.APPLICATION_JSON).content("{}")).andExpect(MockMvcResultMatchers.status().isOk()); 

Я получаю NullPointer когда метод setHeaders вызывается над объектом HttpServletResponse в контроллере. Я не могу понять, как вводить или передавать этот объект ответа, чтобы избежать нулевого указателя. Спасибо за вашу помощь.

ответ

1

При тестировании Spring MVC контроллеры Я всегда использую MockMvc

Смотрите здесь для примера: How to test a spring controller method by using MockMvc?

Документацию можно найти здесь: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#spring-mvc-test-framework

Вот пример из документации с использованием автономной установки:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration("test-servlet-context.xml") 
public class ExampleTests { 

    @Autowired 
    private WebApplicationContext wac; 

    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); 
    } 

    @Test 
    public void getAccount() throws Exception { 
     this.mockMvc.perform(get("/accounts/1").accept(MediaType.parseMediaType("application/json;charset=UTF-8"))) 
      .andExpect(status().isOk()) 
      .andExpect(content().contentType("application/json")) 
      .andExpect(jsonPath("$.name").value("Lee")); 
    } 

} 
+1

Вы являетесь не используя автономную настройку: MockMvcBuilders.webAppContextSetup, но, возможно, используя эту настройку, я избегу пустого указателя ответа. – xiidarkevil

+0

True - спасибо за подсказку, но в случае, описанном в обоих вариантах, необходимо выполнить настройку автономного контекста так: this.mockMvc = MockMvcBuilders.standaloneSetup (новый AccountController()). Build(); ' –

+0

У меня есть моя конфигурация настроена правильно в автономном режиме, мой контроллер предоставляет много URL-адресов и я тестирую их все успешно, но метод, который я показываю, является единственным, который не работает для нулевого указателя в объекте ответа. – xiidarkevil