首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用MockRestServiceServer模拟RestTemplate?

如何用MockRestServiceServer模拟RestTemplate?
EN

Stack Overflow用户
提问于 2017-02-23 15:42:45
回答 3查看 5.8K关注 0票数 1
代码语言:javascript
复制
@RunWith(MockitoJUnitRunner.class)
public class FeatureFlipperManagerTest {
    @Autowired
    RestTemplate restTemplate = new RestTemplate();
    @Autowired
    Service service = new Service();
    MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);

    @Test
    public void test() throws Exception {
      mockServer.expect(requestTo(Mockito.anyString()))
                .andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON));
        boolean res = service.isEnabled("xxx");
        mockServer.verify();
        Assert.assertEquals(true, res);
    }
}

我让MockRestServiceServer在服务中模拟restTemplete。但它总是失败。它将错误显示为java.lang.AssertionError: Further request(s) expected 0 out of 1 were executed。任何人都可以让我知道我哪里做得不对。

服务本身将如下所示:

代码语言:javascript
复制
public class Service{
    public boolean isEnabled(String xxx) {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
        if(...)return true;
        return false;
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-23 15:56:18

首先,您的Service类为每个请求创建一个新的RestTemplate实例。我再怎么强调它是多么糟糕的实践也不为过。创建一个RestTemplate类型的bean,并将其注入到您的Service bean中(它很可能已经创建了--取决于您正在使用的Spring MVC版本)。

一旦拥有了它,那么两个RestTemplates:一个在Service bean中,一个注入到FeatureFlipperManagerTest中将是相同的,并且可以使用MockRestServiceServer进行测试。

编辑-更明确地说:

将您的Service类修改为:

代码语言:javascript
复制
@Component
public class Service {

    private RestTemplate restTemplate;  

    @Autowired 
    public Service(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public boolean isEnabled(String xxx) {
        ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
        if(...)return true;
        return false;
    }
}

和你的测试类来:

代码语言:javascript
复制
@RunWith(MockitoJUnitRunner.class)
public class FeatureFlipperManagerTest {
    @Autowired
    RestTemplate restTemplate;

    @Autowired
    Service service;

    MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);

    @Test
    public void test() throws Exception {
      mockServer.expect(requestTo(Mockito.anyString()))
                .andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON));
        boolean res = service.isEnabled("xxx");
        mockServer.verify();
        Assert.assertEquals(true, res);
    }
}

如果此操作失败,并显示没有Spring,请粘贴有关RestTemplate版本的信息(Spring Boot?)您正在使用。

票数 1
EN

Stack Overflow用户

发布于 2017-02-23 17:00:04

我想你的意思是你想使用spring提供的RestTemplate,所以你应该在spring自动连接RestTemplate之后使用createServer。我认为你可以这样做:

代码语言:javascript
复制
@RunWith(MockitoJUnitRunner.class)
public class FeatureFlipperManagerTest {
    @Autowired
    RestTemplate restTemplate;

    Service service;
    MockRestServiceServer mockServer;

    @Before
    public void init() {
        service = new Service(); 
        service.setRestTemplate(restTemplate);
        // If you have autowired restTemplate in Service, you can just autowired the service
        mockServer = MockRestServiceServer.createServer(restTemplate);
    }

    @Test
    public void test() throws Exception {
      mockServer.expect(requestTo(Mockito.anyString()))
                .andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON));
        boolean res = service.isEnabled("xxx");
        mockServer.verify();
        Assert.assertEquals(true, res);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2021-03-22 22:01:53

这不是对你问题的回答,只是为了以防有人在2021年…遇到这个问题对于Spring Boot测试,您可能希望利用仅使用@RestClientTest测试REST切片的优势。这只会在默认情况下创建一个RestTemplateBuilder bean,如果您想要一个自动连接的RestTemplate,只需添加一点配置,如下所示。(示例是用Kotlin编写的,对于读者来说,使用Java仍然是一种练习。)

代码语言:javascript
复制
@AutoConfigureWebClient(registerRestTemplate = true)
@RestClientTest(Service::class)
class AdkClientTest @Autowired constructor(
    private val mockRestServiceServer: MockRestServiceServer,
    private val service: Service
) {
    // …
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42409768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档