使用MockRestServiceServer

时间:2016-06-13 04:49:10

标签: java spring rest junit

我正在尝试编写一个JUnit测试用例,用于测试辅助类中的方法。该方法使用REST调用外部应用程序,我试图在JUnit测试中模拟这个调用。

helper方法使用Spring的RestTemplate进行REST调用。

在我的测试中,我创建了一个模拟REST服务器并模拟REST模板,并将它们实例化为:

@Before
public void setUp() throws Exception {
    mockServer = MockRestServiceServer.createServer(helperClass.getRestTemplate());
}

然后我对mock服务器进行种子处理,以便在helper方法进行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具有查询参数,如下所示:" http://server:port/application/resource?queryparam1=value1&queryparam2=value2"。

我已经尝试将网址(" http://server:port/application/resource")与一起放入" myURL&#34中的查询参数;变量(引发匹配以便返回响应),但无法让模拟服务器返回任何内容。

我已尝试搜索此类代码的示例,但尚未发现任何与我的情况类似的内容。

Spring version 4.1.7。

提前感谢您的任何帮助。

3 个答案:

答案 0 :(得分:10)

当您创建MockRestServiceServer的实例时,您应该使用生产代码正在使用的现有RestTemplate实例。因此,请尝试将RestTemplate注入测试并在调用MockRestServiceServer.createServer时使用它 - 不要在测试中创建新的RestTemplate

答案 1 :(得分:5)

似乎您正在尝试测试rest-client,其余服务器应该在其他地方进行测试。 您正在使用RestTemplate - >致电该服务。然后,尝试模拟RestTemplate及其调用的结果。

@Mock
RestTemplate restTemplateMock;

和服务测试类

@InjectMocks
Service 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

答案 2 :(得分:0)

您可以创建一个RestTemplate的新实例,但是您必须像这样在createServer方法中传递它:

private RestTemplate restTemplate = new RestTemplate();
@BeforeEach
public void setUp() {
MockitoAnnotations.initMocks(this);
mockServer = MockRestServiceServer.createServer(restTemplate);
client.setRestTemplate(restTemplate);
}