我想使用
RestClient
为 HTTP 调用添加单元测试
我读了一点,似乎我可以使用
@RestClientTest
但这似乎是用于集成测试(它启动服务器)。
https://www.baeldung.com/restclienttest-in-spring-boot
有了
restTemplate
我就能做到。
@Mock
private RestTemplate restTemplate;
private void setRestTemplateResponse(MyResponse response) {
given(restTemplate.getForObject(
"my-endpoint", MyRespose.class
)).willReturn(response);
}
所以我一直在寻找类似的方法来做到这一点。尝试过这个,但得到了
NullPointerException
,因为 restClient.get()
是来自接口的方法
@Mock
private RestClient restClient;
private void setRestTemplateResponse(MyResponse response) {
given(restClient.get().uri("my-endpoint"
).retrieve().body(MyResponse.class)).willReturn(response);
}
编辑#1
补充:
@Autowired
private RestClient restClient;
@BeforeEach
void setup() {
this.restClient = RestClient.builder().build();
adapter = new MyServiceImpl(BASE_URL, restClient);
}
我没有收到异常,但现在,它实际上正在向端点发出请求,这显然失败了
在您的实现中,请记住声明
builder
并使用它来创建所有客户端请求。
@Component
class MyClient {
@Autowired
RestClient.Builder builder;
public myGetRequest() {
RestClient restClient = builder.build();
var response = restClient.get()...
}
}
在单元测试中,使用以下代码结构:
@SpringBootTest
@AutoConfigureMockRestServiceServer
class MyClientTest {
@Autowired
private MyClient myClient;
@Autowired
private MockRestServiceServer mockServer;
@Test
public void myTest() {
mockServer = MockRestServiceServer.bindTo(myClient.builder).build(); // make myClient use mock
mockServer.expect()... // configure mockServer and expectations how it used
var response = myClient.myGetRequest(); // this will use mockServer
assertEquals("expected value", response); // verify the response
}
}