Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用MockRestServiceServer模拟REST调用_Java_Spring_Rest_Junit - Fatal编程技术网

Java 使用MockRestServiceServer模拟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

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

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

在我的测试中,我创建了一个mock-REST服务器和mock-REST模板,并按如下方式对它们进行实例化:

@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
)不同。