我对春季启动很新,并将一个基本的微服务放在一起(它接受一个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,并了解如何模拟另一个类并将其注入您正在测试的类中。但我真的不想在这里申请。任何帮助将不胜感激。
答案 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();
}
答案 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());
}
}