Привет! Я пытаюсь написать несколько тестов для Mockito и PowerMockito (мне нужно смоделировать частные методы) для службы отдыха, написанной на Spring MVC, и я сталкиваюсь со следующей проблемой
Это упрощенная версия контроллера
@Controller
@RequestMapping(value = "/test")
public class SimpleController {
@Autowired
private HttpServletRequest httpRequest;
@RequestMapping(value = "/simpleservice", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@ResponseBody
public SimpleServiceResponse simpleService(@RequestBody SimpleServiceRequest simpleServiceRequest, HttpServletRequest httpServletRequest) {
SimpleServiceResponse simpleServiceResponse=new SimpleServiceResponse(simpleServiceRequest.getValue());
httpRequest.getHeader("Header");
return simpleServiceResponse;
}
}
, и это класс теста на соответствие
@WebAppConfiguration
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:WebApplicationContext.xml","classpath:SimpleApplicationContext.xml"})
@PrepareForTest(WebController.class)
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
public class TestSimpleControllerMockito {
private Logger logger = LoggerFactory.getLogger(TestSimpleControllerMockito.class.getName());
private ObjectMapper objectMapper= new ObjectMapper();
@InjectMocks
private SimpleController controller;
@Test
public void testSimpleService() throws Exception {
MockitoAnnotations.initMocks(this);
SimpleService mockedSimple = mock(SimpleService.class);
when(mockedSimple.doSimpleService(any(SimpleServiceRequest.class))).thenReturn(new SimpleServiceResponse("MockMock"));
SimpleController mockedController=PowerMockito.spy(controller);
SimpleServiceRequest simpleServiceRequest= new SimpleServiceRequest("ciao");
String requestAsStr=objectMapper.writeValueAsString(simpleServiceRequest);
MockMvc mMockMvc=MockMvcBuilders.standaloneSetup(mockedController).build();
MvcResult result= mMockMvc.perform(post("/test/simpleservice").content(requestAsStr).contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andReturn();
String content = result.getResponse().getContentAsString();
SimpleServiceResponse simpleServiceResponse=objectMapper.readValue(content,SimpleServiceResponse.class);
Assert.assertEquals("MockMockMockedSessionManager",simpleServiceResponse.getValue());
}
}
При выполнении теста я получил NullPointerEception на httpRequest.getHeader("Header");
Я предполагаю, что с помощью @InjectMocks
аннотация, а затем использование
SimpleController mockedController=PowerMockito.spy(controller);
является причиной исключения NullPointerException. Я не знаю, как сохранить обработку аннотации @Autowire на объекте контроллера. Я уже нашел обходной путь, но он требует написания избыточного кода. Есть ли способ заставить аннотацию @autowired работать?
Большое спасибо.
PS Классы SimpleServiceXXX похожи на этот:
public class SimpleServiceResponse {
private String value;
public SimpleServiceResponse() {
}
public SimpleServiceResponse(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}