使用 RestClient 进行单元测试 - Spring boot

问题描述 投票:0回答:1

我想使用

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);
    }

我没有收到异常,但现在,它实际上正在向端点发出请求,这显然失败了

java spring-boot unit-testing testing
1个回答
0
投票

在您的实现中,请记住声明

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.