RestTemplate的测试方法分享

娜扎 Spring Cloud 发布时间:2022-05-14 21:46:27 阅读数:14530 1
下文笔者讲述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();
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringCloud/202205/3369.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者