2017-11-15 11 views
0

저는 스프링 부트에 아주 익숙하며 기본 마이크로 서비스를 함께 받았습니다 (Yelp URL을 받아들이고 해당 레스토랑의 이미지를 긁어냅니다). 몇 가지 단위 테스트를 작성하는 것이 좋은시기라고 생각했지만, 문제가있는 한 가지는 서블릿 요청/응답에 대한 테스트에 모의 클래스를 주입하는 것입니다.스프링 부트 - 서블릿 요청/응답 테스트, 가짜 클래스 삽입 방법

테스트하려는 코드는 매우 간단합니다. 이것은 기본적으로 내 서비스의 진입 점이며 JSON 본문을 받아들이고 Yelp url을 추출한 다음 YelpRequestController.makeYelpRequest()은 이미지를 스크랩하고 ArrayList에 이미지 링크를 반환합니다.

@RestController 
public class RequestController { 

    @PostMapping(value = "/") 
    public ArrayList<String> index(@RequestBody String reqBodyString) { 

     //my own function to parse the json string 
     HashMap<String, String> requestBody = parseReqBodyString(reqBodyString); 
     String yelpURL = requestBody.get("yelpURL"); 

     YelpRequestController yelpRequest = new YelpRequestController(yelpURL); 
     ArrayList<String> yelpImgLinks = yelpRequest.makeYelpRequest(); 
     return yelpImgLinks; 
    } 

} 

이것은 단위 테스트 코드입니다. 그것은 기본적으로 JSON 문자열을 만들고 내 RequestController에 요청을 보내고 응답이 괜찮은지 확인합니다. 지금 당장 통과하지만, 시험을 단지 RequestController과 그 밖의 아무것도 시험하지 않기를 바란다. 현재는 테스트에서 URL을 YelpRequestController을 통해 전송하고이 테스트에서 RequestController을 분리하고자하므로 이미지를 스크래핑하기 시작합니다. 나는 YelpRequestController 클래스를 조롱하고 결과를 반환하려했지만 정말 많은 문제가 있습니다.

@RunWith(SpringRunner.class) 
@SpringBootTest 
@AutoConfigureMockMvc 
public class RequestControllerTest { 

    @Autowired 
    private MockMvc mvc; 

    @Test 
    public void postRequestController() throws Exception { 
     ObjectMapping jsonObject = new ObjectMapping(); 
     jsonObject.setYelpUrl("https://www.yelp.ca/biz/l-industrie-pizzeria-brooklyn"); 
     Gson gson = new Gson(); 
     String json = gson.toJson(jsonObject); 
     mvc.perform(MockMvcRequestBuilders.post("/") 
       .accept(MediaType.APPLICATION_JSON) 
       .content(json)) 
       .andExpect(status().isOk()); 
    } 
} 

내가 Mockito를 사용하고, 다른 클래스를 조롱하고 테스트 클래스에 주입하는 방법을 이해하는 방법에 대해 읽어 봤는데. 그러나 나는 그것을 여기에서 적용하려고 정말로 붙이게된다. 어떤 도움을 주시면 감사하겠습니다.

+0

:

@RestController public class RequestController { @Autowired private YelpRequestController yelpRequest; @PostMapping(value = "/") public ArrayList<String> index(@RequestBody String reqBodyString) { //my own function to parse the json string HashMap<String, String> requestBody = parseReqBodyString(reqBodyString); String yelpURL = requestBody.get("yelpURL"); ArrayList<String> yelpImgLinks = yelpRequest.makeYelpRequest(yelpURL); return yelpImgLinks; } } 

을 테스트 클래스에서 당신은 당신이 자동으로 @Autowired 필드를 사용합니다 @MockBean 봄과 조롱 할 클래스에 주석을 YelpRequestController를 SPring 빈으로 만듭니다. 귀하의 RequestController에서 Autowire하십시오. yelpURL을 생성자가 아닌 makeYelpRequest() 메서드에 전달하여 상태 비 저장 개체로 만듭니다. 그런 다음 유닛 테스트에서 모의 ​​YelpRequestController를 RequestController에 삽입 할 수 있습니다. 테스트 가능성은 의존성 주입에 관한 것입니다. 'new'를 사용하여 의존성을 직접 만들면 모의 의존성을 주입 할 수 없게됩니다. –

+0

아, 고맙습니다. – user2889046

답변

0

안녕하세요. 내 답변이 도움이되기를 바랍니다. 당신이 MVC를 초기화해야 시험을 시작하기 전에,

@Autowired 
private WebApplicationContext context; 

private MockMvc mvc; 

@Before 
public void setUp() { 
    this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build(); 
} 

을 아래에 간단한 참조하십시오. 따라서 테스트 전에 응용 프로그램을 준비해야합니다. 는 SpringMVC

private MockMvc mockMvc; 

@InjectMocks 
private UserController userController; 

@Before 
public void init(){ 
    MockitoAnnotations.initMocks(this); 
    mockMvc = MockMvcBuilders 
      .standaloneSetup(userController) 
      .addFilters(new CORSFilter()) 
      .build(); 
} 

을 SoringBoot 당신은 당신의 컨트롤러를 삽입해야합니다.

0

주석에서 지적한대로 컨트롤러에서 종속성 삽입을 사용하여 테스트 할 수 있도록 격리하려고합니다. 그런 다음이 특정 컨트롤러를 대상으로 WebMvcTest을 사용할 수 있습니다. SpringBootTest과 달리 전체 ApplicationContext을로드하지 않습니다.

이이 같은 것을 볼 수 있었다 :

@RunWith(SpringRunner.class) 
@WebMvcTest(RequestController.class) 
@AutoConfigureMockMvc 
public class RequestControllerTest { 

    @Autowired 
    private MockMvc mvc; 
    @MockBean 
    private YelpRequestController yelpRequest; 

    @Test 
    public void postRequestController() throws Exception { 
     ObjectMapping jsonObject = new ObjectMapping(); 
     jsonObject.setYelpUrl("https://www.yelp.ca/biz/l-industrie-pizzeria-brooklyn"); 
     Gson gson = new Gson(); 
     String json = gson.toJson(jsonObject); 
     mvc.perform(MockMvcRequestBuilders.post("/") 
       .accept(MediaType.APPLICATION_JSON) 
       .content(json)) 
       .andExpect(status().isOk()); 
    } 
}