복붙노트

[SPRING] Spring 5와 JUnit 5 + Mockito - 컨트롤러 메소드는 null을 반환합니다.

SPRING

Spring 5와 JUnit 5 + Mockito - 컨트롤러 메소드는 null을 반환합니다.

결과를 문자열로 반환하는 MainController에 정의 된 loadData라는 메서드를 테스트하려고합니다. 이 메소드는 실제로 웹 애플리케이션이 서블릿 컨테이너에서 실행될 때 (또는 코드를 디버깅 할 때) 데이터를 리턴하지만, Mockito와 함께 JUnit 5를 기반으로하는 테스트 클래스에서 데이터를 호출 할 때 데이터가 리턴되지 않는다.

여기 내 구성은 다음과 같습니다.

@ContextConfiguration(classes = {WebAppInitializer.class, AppConfig.class, WebConfig.class})
@Transactional
@WebAppConfiguration
public class TestMainController {

    @InjectMocks
    private MainController mainController;

    private MockMvc mockMvc;

    @BeforeEach
    public void init() {
        mockMvc = MockMvcBuilders.standaloneSetup(this.mainController).build();
    }

    @Test
    public void testLoadData() throws Exception {
        MvcResult mvcResult = mockMvc
                .perform(MockMvcRequestBuilders.get("/loadData.ajax"))
                .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();

        Assertions.assertNotNull(mvcResult.getResponse().getContentAsString(), "response should not be null");
    }

}

this.mainController가 null이므로 java.lang.NullPointerException으로 인해 테스트가 실패합니다.

환경 세부 정보 :

Spring version: 5.0.3
JUnit version: 5.0.3
mockito version: 1.9.5
hamcrest version: 1.3
json-path-assert version: 2.2.0

편집 : 여기에 MainController loadData 메서드가 있습니다 :

@RequestMapping(value = "/loadData.ajax", method = RequestMethod.GET)
public String loadData(HttpServletRequest request, HttpServletResponse response) {
    List list = mainService.loadData(); // starts a transaction and invokes the loadData method of mainDAO repository which basically loads data from the database
    return JSONArray.fromObject(list).toString();
}

해결법

  1. ==============================

    1.서비스 메서드와 마찬가지로 컨트롤러 메서드를 직접 호출 할 수도 있지만 권장하지는 않습니다. MockMvc를 사용하면 헤더 및 요청 매개 변수 매핑이 올바른지 확인합니다. 또한 끝점 매핑이 올바른지 확인합니다. 게다가 요청 방법도 정확합니다. 이 모든 것은 컨트롤러 메소드를 직접 호출하여 코드를 테스트하면 테스트 할 수 없습니다.

    서비스 메서드와 마찬가지로 컨트롤러 메서드를 직접 호출 할 수도 있지만 권장하지는 않습니다. MockMvc를 사용하면 헤더 및 요청 매개 변수 매핑이 올바른지 확인합니다. 또한 끝점 매핑이 올바른지 확인합니다. 게다가 요청 방법도 정확합니다. 이 모든 것은 컨트롤러 메소드를 직접 호출하여 코드를 테스트하면 테스트 할 수 없습니다.

    시도 할 수있는 한 가지 방법은 독립형 컨텍스트 내부에 새 객체를 만드는 대신 Mock을 사용하는 것입니다. 즉

    mockMvc = MockMvcBuilders.standaloneSetup(this. mainController).build();
    

    전화하는 동안

    MvcResult mvcResult = mockMvc
        .perform(MockMvcRequestBuilders.get("/loadData.ajax"))
        .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
    

    주장하다, 무엇을하고 싶니?

    Assert.assertEquals("response does not match", mvcResult.getResponse().getContentAsString(),
        "some expected response");
    

    null 또는 400 또는 404 http 상태가 표시됩니까?

    400을 얻는다면 헤더와 req를 확인하십시오. param이 적절한 경우. 404를 얻는다면 URL 경로를 확인하십시오. /loadData.ajax, 이것이 컨트롤러 메소드의 요청 매핑 경로라고 가정합니다.

  2. from https://stackoverflow.com/questions/48727758/spring-5-with-junit-5-mockito-controller-method-returns-null by cc-by-sa and MIT license