如何在Java Spring中模拟RestTemplate?

2022-09-02 00:53:37
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);
    }

我试图为包括休息客户端在内的服务测试一个简单的测试。看起来我没有成功嘲笑。看起来代码获取的是真实数据,而不是模拟数据。任何人都可以帮助我。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;
    }
}

答案 1

问题是,在你的中,你正在创建一个新的 RestTemplate。这是错误的,原因有两个,一个是你不能嘲笑它,因为你正在创建一个新的对象,其次,避免为每个请求创建新对象是件好事。RestTemplate 是线程安全的,因此可以作为服务类成员,跨多个线程使用。isEnabled

将服务类更改为如下所示的内容:

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 已成为类成员,您现在可以通过以下两种方式之一进行适当的模拟。第一,使用 注入它,或者使用从测试中调用的 setter 方法。@InjectMock

由于您在代码中使用In 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);
    }

请注意,我做了一些更改。首先,我删除了 和 .你应该让mojito为你创建这些。通过注释它们,您将确保Mockito将为您创建它们,更重要的是,将模拟注入到您的对象中。new RestTemplate()new Service()@Mock@Spyservice


答案 2

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

这是关于其使用的教程


推荐