Spring引导测试servlet请求/响应,如何注入mock类



我对spring-boot还很陌生,已经组装了一个基本的微服务(它接受Yelp url并为该餐厅抓取图像)。我认为现在是编写一些单元测试的好时机,但有一件事我遇到了麻烦,那就是在servlet请求/响应的测试中注入mock类。

我尝试测试的代码非常简单,看起来像这样。这基本上是我的服务的入口点,它接受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的文章,并了解如何模拟另一个类并将其注入到正在测试的类中。但我真的很难在这里应用它。如有任何帮助,我们将不胜感激。

嗨,我希望我的回答能对你有所帮助。请参阅下面的简单介绍,

@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

正如注释中所指出的,您希望在控制器中使用依赖项注入,使其能够在隔离状态下进行测试。然后,您可以使用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());
}
}

最新更新