我是单元测试的新手。引用google之后,我创建了一个Test类来测试我的Controller,如下所示:
@RunWith(SpringRunner.class)
@WebMvcTest(PromoController.class)
public class PromoApplicationTests {
@Autowired
protected MockMvc mvc;
@MockBean PromoService promoService;
protected String mapToJson(Object obj) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.writeValueAsString(obj);
}
protected <T> T mapFromJson(String json, Class<T> clazz)
throws JsonParseException, JsonMappingException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(json, clazz);
}
@Test
public void applyPromotionTest_1() throws Exception {
String uri = "/classPath/methodPath";
List<Cart> cartLs = new ArrayList<Cart>();
// added few objects to the list
String inputJson = mapToJson(cartLs);
MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(uri)
.contentType(MediaType.APPLICATION_JSON).content(inputJson)).andReturn();
int status = mvcResult.getResponse().getStatus();
assertEquals(200, status);
String actual = mvcResult.getResponse().getContentAsString();
String expected = "{\"key1\":val1, \"key2\":\"val 2\"}";
assertEquals(expected, actual, true);
}
}
我具有以下Controller和service类:
@RequestMapping("/classPath")
@RestController
public class PromoController {
@Autowired
PromoService promoService;
@PostMapping("/methodPath")
public PromoResponse applyPromo(@RequestBody List<Cart> cartObj) {
PromoResponse p = promoService.myMethod(cartObj);
return p;
}
}
@Component
public class PromoServiceImpl implements PromoService{
@Override
public PromoResponse myMethod(List<Cart> cartList) {
// myCode
}
}
调试单元测试时,控制器中的p对象为空。 我的状态为200,但不是预期的JSON响应
我在这里想念什么?
答案 0 :(得分:3)
在使用@WebMvcTest弹簧启动时,只会初始化Web层,而不会加载完整的应用程序上下文。并且您需要在使用@MockBean
的同时使用@WebMvcTest
创建和注入模拟。
您完成了什么
@MockBean
PromoService promoService;
Spring Boot仅实例化Web层,而不是整个上下文
我们使用@MockBean创建并注入GreetingService的模拟程序(如果不这样做,则应用程序上下文无法启动),我们使用Mockito设置其期望值。
但是,由于它是模拟bean,因此您有责任模拟myMethod()
调用
@Test
public void applyPromotionTest_1() throws Exception {
String uri = "/classPath/methodPath";
List<Cart> cartLs = new ArrayList<Cart>();
// added few objects to the list
// create PromoResponse object you like to return
When(promoService.myMethod(ArgumentsMatchesr.anyList())).thenReturn(/*PromoResponse object */);
String inputJson = mapToJson(cartLs);
MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(uri)
.contentType(MediaType.APPLICATION_JSON).content(inputJson)).andReturn();
int status = mvcResult.getResponse().getStatus();
assertEquals(200, status);
String actual = mvcResult.getResponse().getContentAsString();
String expected = "{\"key1\":val1, \"key2\":\"val 2\"}";
assertEquals(expected, actual, true);
}