MockRestServiceServer 类用于 mock 使用 RestTemplate 调用 http 接口的返回,假设我们有个接口是这样的,使用了 RestTemplate 调用 http 接口获取信息:
@Validated
@RestController
@RequestMapping("/admin/test")
public class TestController {
@Autowired
private TestService testService;
@PostMapping("/getOrderPayType")
public Result<String> getOrderPayType(@RequestBody JsonNode jsonNode) {
return new Result<>(testService.getOrderPayType(jsonNode.get("orderCode").asText()));
}
}
@Service
public class TestServiceImpl implements TestService {
@Autowired
private RestTemplate restTemplate;
@Override
public String getOrderPayType(String orderCode) {
JsonNode jsonNode = restTemplate.getForObject("http://b2c-cloud-order-service/getOrderPayType?orderCode={1}", JsonNode.class, orderCode);
return Objects.requireNonNull(jsonNode).get("payType").asText();
}
}
那么单元测试就可以这样写:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {
DatasourceTestConfig.class,
SecurityTestConfig.class,
WebTestConfig.class,
TestController.class,
TestServiceImpl.class
})
@AutoConfigureMockMvc
@AutoConfigureWebMvc
@WebAppConfiguration
@ActiveProfiles("PROFILE_UNIT_TEST")
public class MockRestServiceServerTests extends CommonTestCode {
@Autowired
protected MockMvc mockMvc;
@Autowired
private RestTemplate restTemplate;
@Test
@WithMockUser(
username = "admin",
password = "admin",
authorities = "ROLE_ADMIN"
)
@SneakyThrows
public void test() {
MockRestServiceServer server = MockRestServiceServer.bindTo(restTemplate).build();
// mock http接口的返回
server
.expect(requestTo("http://b2c-cloud-order-service/getOrderPayType?orderCode=C93847639357"))
.andRespond(withSuccess("{\"orderCode\":\"C93847639357\",\"payType\":\"alipay\"}", MediaType.APPLICATION_JSON_UTF8));
mockMvc
.perform(
post("/admin/test/getOrderPayType")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content("{\"orderCode\":\"C93847639357\"}")
.accept(MediaType.APPLICATION_JSON_UTF8)
)
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$.data").value("alipay"));
}
}
网友评论