Как сохранить автоматическую разводку HttpServletRequest при тестировании с Spring MVC Mockito и PowerMockito - PullRequest
0 голосов
/ 27 марта 2020

Привет! Я пытаюсь написать несколько тестов для 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;
    }
}
...