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();
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


