Spring启动 - 测试servlet请求/响应,如何注入模拟类?

时间:2017-11-15 07:38:15

标签: java unit-testing spring-boot mockito spring-boot-test

我对春季启动很新,并将一个基本的微服务放在一起(它接受一个Yelp网址并为该餐厅搜索图像)。我认为现在是编写一些单元测试的好时机,但是我遇到的一件事就是将模拟类注入我的servlet请求/响应测试中。

我试图测试的代码非常简单,看起来像这样。这基本上是我的服务的入口点,它接受一个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而不是其他任何东西。目前它通过YelpRequestController从测试中发送url并开始抓取图像,这是我不想要的,因为我只想在此测试中隔离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,并了解如何模拟另一个类并将其注入您正在测试的类中。但我真的不想在这里申请。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

嗨,我希望我的回答可以帮到你很多。请看下面的简单,

@Autowired
private WebApplicationContext context;

private MockMvc mvc;

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

在开始测试之前,您必须初始化 mvc 。因此,您需要在测试之前准备好应用程序。的 SoringBoot

 private MockMvc mockMvc;

@InjectMocks
private UserController userController;

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

SpringMVC你需要注入你的控制器。

答案 1 :(得分:0)

正如评论中指出的那样,您希望在控制器中使用依赖注入,使其可以独立测试。 然后,您可以使用针对此特定控制器的WebMvcTest。与SpringBootTest相比,这并不会加载您的ApplicationContext

这看起来像这样:

@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;
    }

}

在您的测试类中,您使用@MockBean注释要模拟的类,Spring将自动将其用于@Autowired字段:

@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());
    }
}