我正在尝试编写一个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。
提前感谢您的任何帮助。
答案 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);
}