如何在 Java Spring 中模拟 RestTemplate?

新手上路,请多包涵
public class ServiceTest {
    @Mock
    RestTemplate restTemplate = new RestTemplate();
    @InjectMocks
    Service service = new Service();
    ResponseEntity responseEntity = mock(ResponseEntity.class);

    @Test
    public void test() throws Exception {
        Mockito.when(restTemplate.getForEntity(
                Mockito.anyString(),
                Matchers.any(Class.class)
                ))
                .thenReturn(responseEntity);
        boolean res = service.isEnabled("something");
        Assert.assertEquals(res, false);
    }

我尝试对包含 restclient 的服务进行简单测试。看来我还没有模拟 RestTemplate 成功。看起来代码获取的是真实数据而不是模拟数据。任何人都可以帮助我。

该服务本身将如下所示:

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

原文由 c2340878 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 892
2 个回答

问题是在您的 isEnabled 中,您正在创建一个新的 RestTemplate。这是错误的,原因有二,一是你不能模拟它,因为你正在创建一个新对象,二是最好避免为每个请求创建新对象。 RestTemplate 是线程安全的,因此可以成为服务类成员,跨多个线程使用。

将您的服务类别更改为如下所示:

 public class Service{

    RestTemplate restTemplate = new RestTemplate();

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

现在您的 RestTemplate 已成为类成员,您现在可以通过两种方式之一正确模拟。第一,使用 @InjectMock 注入它,或使用您从测试中调用的 setter 方法。

由于您在代码中使用了 InjectMock,我们可以使用它。

 @RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
    @Mock
    RestTemplate restTemplate;
    @InjectMocks
    @Spy
    Service service;
    ResponseEntity responseEntity = mock(ResponseEntity.class);

    @Test
    public void test() throws Exception {
        Mockito.when(restTemplate.getForEntity(
                Mockito.anyString(),
                ArgumentMatchers.any(Class.class)
                ))
                .thenReturn(responseEntity);
        boolean res = service.isEnabled("something");
        Assert.assertEquals(res, false);
    }

请注意,我做了一些更改。首先,我删除了 new RestTemplate()new Service() 。你应该让 mockito 为你创建那些。通过用 @Mock@Spy 注释它们,您将确保 Mockito 会为您创建它们,更重要的是,会将模拟注入到您的 service

原文由 Jose Martinez 发布,翻译遵循 CC BY-SA 4.0 许可协议

Spring MVC的测试框架提供了类 MockRestServiceServer 用于单元测试RESTful服务代码。

这是一个关于它的使用 教程

原文由 Keith 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题