2016-06-13 100 views
4

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

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

在我的测试中,我创建了一个模拟REST服务器和模拟REST模板和instanitiate他们是这样的:

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

我再播种模拟服务器,以便当辅助方法使得它应该返回一个适当的反应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调用的空响应并且测试失败。

其余网址助手造就了查询参数,看起来像这样:“http://server:port/application/resource?queryparam1=value1&queryparam2=value2”。

我试图把URL(“http://server:port/application/resource”)都与无查询参数在‘myURL’变量(引起的匹配,使其返回响应),但不能得到模拟服务器返回任何东西。

我试着寻找这种代码的例子,但还没有找到任何东西,这似乎像我的方案。

春季版4.1.7。

在此先感谢您的帮助。

+0

Tha用于将该类写入静态方法的不同之处在于它不像其他许多源一样。 'requestTo'。 – sjngm

回答

6

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

+0

这个问题是我的错。我为测试使用了一个模拟RestTemplate对象,而不是根据您的建议正确实例化的对象。一旦这个被替换,测试成功运行。 – GarlicBread

+0

我也遇到了测试RestTemplate的问题。但是,就我而言,我无法访问RestTemplate实例。我的助手类中的代码就像'new RestTemplate()。exchange(uri,HttpMethod.GET,...)'。我如何测试这个。 –

4

似乎你正在尝试测试其余的客户端,其余的服务器应该在其他地方测试。 您正在使用RestTemplate - >调用服务。然后,试图模拟RestTemplate及其调用的结果。

@Mock 
RestTemplate restTemplateMock; 

和服务在测试类

@InjectMocks 
Service service; 

让我们说,服务必须是测试作为

public void filterData() { 
    MyResponseModel response = restTemplate.getForObject(serviceURL, MyResponseModel.class); 
    // further processing with response 
} 

的方法之后,测试筛选数据的方法,你需要模拟响应从restTemplate调用如

mockResponseModel = createMockResponse(); 
Mockito.when(restTemplateMock.getForObject(serviceURL, MyResponseModel.class)).thenReturn(mockResponseModel); 

service.filterData(); 
//Other assert/verify,... go here