RestTemplate的测试方法分享
下文笔者讲述RestTemplate测试代码的编写方法分享,如下所示
由于在RestTemplate中经常需调用HTTP请求,那么如何编写单元测试呢? 笔者下文将讲述使用Mockito模拟库模拟 或使用Spring Test 提供的 MockRestServiceServer 模拟服务器
使用Mockito模拟
例:@Service("userServiceRest") public class UserService { @Autowired private RestTemplate restTemplate; public list<UserVO> getUsers() { UserVO[] users = restTemplate.getForObject("http://localhost:8080/users", UserVO[].class); if (users == null) { return Collections.emptyList(); } return Arrays.asList(users); } } //单元测试代码 @RunWith(SpringRunner.class) @SpringBootTest public class UserServiceTest { // 模拟一个假的 RestTemplate 实例 @Mock private RestTemplate restTemplate; @Autowired @Qualifier("userServiceRest") @InjectMocks private UserService userService; @Before public void setup() { MockitoAnnotations.initMocks(this); } @Test public void testGetUsers() { UserVO mockUser = new UserVO(1, "mock-test"); // 模拟一个假的请求 Mockito.when(restTemplate.getForObject("http://localhost:8080/users", UserVO[].class)) .thenReturn(new UserVO[]{mockUser}); List<UserVO> users = userService.getUsers(); Assert.assertFalse(CollectionUtils.isEmpty(users)); Assert.assertEquals(1, users.size()); UserVO userVO = users.get(0); Assert.assertEquals(mockUser.getId(), userVO.getId()); Assert.assertEquals(mockUser.getName(), userVO.getName()); } } 在以上的单元测试中 先使用Mockito模拟库中@Mock注解创建一个假RestTemplate实例 再使用@InjectMocks注释UserService实例,将模拟的实例注入到其中 最后在测试方法中,使用Mockito的when()和then()方法定义了模拟的行为
使用Spring Test 模拟
Spring Test模块中MockRestServiceServer模拟服务器 使用这种方式,可将服务器配置为在通过RestTemplate实例调度特定请求时返回特定对象 然后在该服务器实例上调用verify()方法验证 MockRestServiceServer的原理: 使用MockClientHttpRequestFactory拦截HTTP API调用 根据配置,它会创建预期请求和相应的响应列表 当 RestTemplate 实例调用 API 时,他会从配置中找出请求和返回的响应信息例:@RunWith(SpringRunner.class) @SpringBootTest public class UserServiceMockRestServiceServerTest { @Autowired private UserService userService; @Autowired private RestTemplate restTemplate; private MockRestServiceServer mockServer; private ObjectMapper mapper = new ObjectMapper(); @Before public void init() { mockServer = MockRestServiceServer.createServer(restTemplate); } @Test public void testGetUsers() throws Exception { UserVO mockUser = new UserVO(1, "mock-test"); // 模拟 RestTemplate 请求 mockServer.expect(ExpectedCount.once(), MockRestRequestMatchers.requestTo(new URI("http://localhost:8080/users"))) .andExpect(MockRestRequestMatchers.method(HttpMethod.GET)) .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK) .contentType(MediaType.APPLICATION_JSON) .body(mapper.writeValueAsString(new UserVO[]{mockUser})) ); List<UserVO> users = userService.getUsers(); Assert.assertFalse(CollectionUtils.isEmpty(users)); UserVO userVO = users.get(0); Assert.assertEquals(mockUser.getId(), userVO.getId()); Assert.assertEquals(mockUser.getName(), userVO.getName()); mockServer.verify(); } } @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。