当前位置: 首页 > 面试题库 >

如何使用MockRestServiceServer模拟RestTemplate?

路雅懿
2023-03-14
问题内容
@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。任何人都可以让我知道我在哪里做错了。

服务本身将如下所示:

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;
    }
}

问题答案:

首先,您的Service类会在每个请求上创建一个RestTemplate的新实例。我不能足够强调这种不良做法。创建一个类型为RestTemplate的bean并将其注入到您的Servicebean中(它很可能已经创建-
取决于您使用的Spring MVC版本)。

一旦有了它,那么两个RestTemplates:一个在您的Servicebean中,另一个在其中注入,FeatureFlipperManagerTest将是相同的,并且MockRestServiceServer可以进行测试

编辑-更明确地说:

将您的Service班级修改为:

@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;
    }
}

和您的测试课程:

@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);
    }
}

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



 类似资料:
  • 问题内容: 我正在尝试编写一个JUnit测试用例,用于测试助手类中的方法。该方法使用REST调用外部应用程序,而这正是我试图在JUnit测试中模拟的调用。 helper方法使用Spring的RestTemplate进行REST调用。 在测试中,我创建了一个模拟REST服务器和一个模拟REST模板,并按如下所示实例化它们: 然后,我给模拟服务器添加种子,以便当助手方法进行REST调用时它应返回适当的

  • 问题内容: 我只是想知道如何使用JavaScript模拟元素的点击。 目前我有: 但这不起作用:( 有任何想法吗? 问题答案: 这是我煮的 这很简单,但是有效: 用法:

  • 代码示例: 第二个问题--模拟scala对象,似乎需要使用其他方法来创建这样的服务。

  • 我需要卸载一个静态方法 public TestESMock()引发ConfigurationException{ 有人能告诉我怎么做吗。

  • 我的测试存根是 我在这里做错了什么?

  • 问题内容: 我有UIWebview,它可以对外部服务进行AJAX调用。离线时,我需要捕获这些请求并返回本地json。 我实现了NSURLProtocol并设法捕获AJAX请求,问题是jquery始终返回0错误代码: }); 我总是收到一个请求。状态= 0 为了测试我的协议,我尝试在html中模拟图像,并且效果很好。 从google.fr =>对图像的HTML请求 工作正常 在亚马逊=>上对json