Spring boot 如何在Spring引导集成测试中模拟rest客户端

Spring boot 如何在Spring引导集成测试中模拟rest客户端,spring-boot,integration-testing,resttemplate,wiremock,Spring Boot,Integration Testing,Resttemplate,Wiremock,在用@SpringBootTest注释并用@RunWith(SpringRunner.class)运行的spring boot集成测试中,我可以通过@Autowired testrestemplate restemplate和restemplate.postForEntity(…) 这很好,就在controller->service->restclient链的末尾,我有一个restclientbean,它在里面使用rest模板调用第三方rest端点,所以我必须模拟这个端点。我找到了这个libco

在用
@SpringBootTest
注释并用
@RunWith(SpringRunner.class)
运行的spring boot集成测试中,我可以通过
@Autowired testrestemplate restemplate
restemplate.postForEntity(…)


这很好,就在controller->service->restclient链的末尾,我有一个restclientbean,它在里面使用rest模板调用第三方rest端点,所以我必须模拟这个端点。我找到了这个lib
com.github.tomakehurst.wiremock.client.wiremock
,它可以用于此,但我想知道是否有一种很好的spring引导方法,比如用
@RestClientTest
测试rest客户机来实现这一点。我试图模拟
MockRestServiceServer
,这样我就可以在上面写
期望和响应
,但它似乎没有得到它。我的rest客户端中的rest模板始终创建为真实模板,因此我对第三方端点的调用失败。

您可以在使用之前在
@中插入模拟


您可以将
@MockBean
(参见示例)用于
RestTemplate
,但我认为wiremock是一种更合适的抽象级别,对如何调用这些端点的重构更具弹性。@rest模板上的MockBean也不起作用。它只是不模拟rest客户机内部的模板。另外,您可以对服务使用Spy,并且只模拟rest调用。有时为了这个目的,我在服务中创建了一个方法,例如:
public Client getRestClient()
,我将其用于未来的间谍活动。好的,也许是一种可能的方法,但在我看来,这看起来像是一种黑客行为,而不是一种准备好的spring引导解决方案。在这种情况下,我宁愿选择WireMockBean,只要对RestClient使用@MockBean,而不是RestTemplate?!谢谢,但反射似乎不是一个没有黑客的解决方案。也许没有spring引导的方法,他们可以改进这一点。如果你不喜欢反射,你也可以创建和使用setter。谢谢,实际上我想要的是一个好的设计,而不仅仅是一种可能性。仅仅为了测试而添加setter并不是真正需要的。
@Inject
private Service service;

@Mock
private RestClient restClient;

@Before
public void setup() {
    ReflectionTestUtils.setField(service, "restClient", restClient);
}