Java 使用MockRestServiceServer模拟REST调用
我正在尝试编写一个JUnit测试用例,用于测试助手类中的方法。该方法使用REST调用外部应用程序,我正试图在JUnit测试中模拟这个调用 helper方法使用Spring的RestTemplate进行REST调用 在我的测试中,我创建了一个mock-REST服务器和mock-REST模板,并按如下方式对它们进行实例化:Java 使用MockRestServiceServer模拟REST调用,java,spring,rest,junit,Java,Spring,Rest,Junit,我正在尝试编写一个JUnit测试用例,用于测试助手类中的方法。该方法使用REST调用外部应用程序,我正试图在JUnit测试中模拟这个调用 helper方法使用Spring的RestTemplate进行REST调用 在我的测试中,我创建了一个mock-REST服务器和mock-REST模板,并按如下方式对它们进行实例化: @Before public void setUp() throws Exception { mockServer = MockRestServiceServer.cre
@Before
public void setUp() throws Exception {
mockServer = MockRestServiceServer.createServer(helperClass.getRestTemplate());
}
private RestTemplate restTemplate = new RestTemplate();
@BeforeEach
public void setUp() {
MockitoAnnotations.initMocks(this);
mockServer = MockRestServiceServer.createServer(restTemplate);
client.setRestTemplate(restTemplate);
}
然后,我为模拟服务器设置种子,以便它在助手方法进行REST调用时返回适当的响应:
// response is some XML in a String
mockServer
.expect(MockRestRequestMatchers.requestTo(new URI(myURL)))
.andExpect(MockRestRequestMatchers.method(HttpMethod.GET))
.andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK)
.contentType(MediaType.APPLICATION_XML)
.body(response));
当我运行测试时,helper方法从它发出的REST调用接收到一个空响应,测试失败
帮助器生成的REST URL具有查询参数,如下所示:“”
我已经尝试将URL(“”)连同查询参数和不连同查询参数一起放入“myURL”变量中(以获取匹配以便返回响应),但无法让模拟服务器返回任何内容
我已经尝试过搜索此类代码的示例,但还没有找到任何类似于我的场景的代码
Spring版本4.1.7
提前感谢您的帮助。当您创建
MockRestServiceServer
的实例时,您应该使用生产代码正在使用的RestTemplate
的现有实例。因此,尝试将restemplate
注入到测试中,并在调用MockRestServiceServer.createServer
时使用它-不要在测试中创建新的restemplate
。似乎您正在尝试测试rest客户端,应该在其他地方测试rest服务器。
您正在使用RestTemplate->调用该服务。然后,尝试模拟RestTemplate及其调用的结果
@Mock
RestTemplate restTemplateMock;
测试类中的数据和服务
@InjectMocks
Service service;
比方说,服务有一个方法需要测试
public void filterData() {
MyResponseModel response = restTemplate.getForObject(serviceURL, MyResponseModel.class);
// further processing with response
}
然后,为了测试filterData方法,您需要模拟restTemplate调用的响应,例如
mockResponseModel = createMockResponse();
Mockito.when(restTemplateMock.getForObject(serviceURL, MyResponseModel.class)).thenReturn(mockResponseModel);
service.filterData();
//Other assert/verify,... go here
您可以创建RestTemplate的新实例,但必须在createServer方法中传递它,如下所示:
@Before
public void setUp() throws Exception {
mockServer = MockRestServiceServer.createServer(helperClass.getRestTemplate());
}
private RestTemplate restTemplate = new RestTemplate();
@BeforeEach
public void setUp() {
MockitoAnnotations.initMocks(this);
mockServer = MockRestServiceServer.createServer(restTemplate);
client.setRestTemplate(restTemplate);
}
问题是我的错误。我在测试中使用了模拟的RestTemplate对象,而不是按照您的建议正确实例化的对象。一旦这个被替换,测试就成功运行了。我也面临着测试RestTemplate的问题。但是,在我的例子中,我没有访问RestTemplate实例的权限。我的助手类中的代码类似于
newrestemplate().exchange(uri,HttpMethod.GET,…)
。我怎么能测试这个呢。非常感谢你提出这么重要的一点,我从一个月以来一直在努力解决这个问题。而这是一个棘手的部分(如此明显),无法看到。谢谢,我们也可以模拟外国客户机吗?感谢您将类编写到静态方法中,这与许多其他源(例如,requestTo
)不同。