返回

用 MockRestServiceServer 模拟 RestTemplate 交换:单元测试 REST 请求

java

用 MockRestServiceServer 模拟 RestTemplate 交换

简介

在编写单元测试时,我们经常需要模拟与外部服务器交互。对于使用 Spring 的 RestTemplate 发起 REST 请求的代码,我们可以使用 MockRestServiceServer 来模拟 exchange() 方法。本文将指导您如何使用 MockRestServiceServer 来编写针对 RestTemplate REST 请求的服务类的单元测试。

准备工作

首先,我们需要引入必要的依赖项:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <version>2.6.6</version>
  <scope>test</scope>
</dependency>

模拟 RestTemplate 的 exchange() 方法

步骤 1:创建 MockRestServiceServer 实例

MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);

步骤 2:设置预期

mockServer.expect(requestTo("/objects/get-objectA")).andExpect(method(HttpMethod.POST));

步骤 3:设置响应

.andRespond(withSuccess("{json list response}", MediaType.APPLICATION_JSON));

编写单元测试

步骤 1:初始化测试类

@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest {

  @Mock
  private RestTemplate restTemplate;

  @InjectMocks
  private SomeService underTest;
}

步骤 2:设置测试方法

@Test
public void testGetObjectAList() {
  // 设置预期和响应
  mockServer.expect(requestTo("/objects/get-objectA")).andExpect(method(HttpMethod.POST))
      .andRespond(withSuccess("{json list response}", MediaType.APPLICATION_JSON));

  // 执行被测方法
  List<ObjectA> res = underTest.getListofObjectsA();

  // 断言
  Assert.assertEquals(myobjectA, res.get(0));
}

常见问题解答

  1. MockRestServiceServer 的好处是什么?
    • 它允许我们模拟 RestTemplate 的请求行为,从而在单元测试中验证 REST 请求。
  2. 我可以在 MockRestServiceServer 上设置哪些期望?
    • 您可以设置对端点、HTTP 方法、请求正文和标头以及其他条件的期望。
  3. 如何在 MockRestServiceServer 上设置响应?
    • 您可以使用 withSuccess()、withError() 和其他方法来设置响应代码、正文和标头。
  4. 如何使用 MockRestServiceServer 验证请求?
    • 使用 expect() 和 andExpect() 方法来设置预期,然后使用 verify() 方法来验证请求是否满足预期。
  5. 如何在单元测试中使用 MockRestServiceServer?
    • 通过初始化 MockRestServiceServer、设置预期、执行被测方法并断言结果来集成到单元测试中。

结论

使用 MockRestServiceServer 模拟 RestTemplate 的 exchange() 方法是编写针对使用 RestTemplate 发起 REST 请求的服务类的单元测试的强大方法。通过遵循本指南中的步骤,您可以轻松地设置预期、响应并验证请求,从而提高测试的稳定性和可重复性。