mockito 如何在Java Spring中模拟本地RestTemplate?

fafcakar  于 12个月前  发布在  Java
关注(0)|答案(3)|浏览(175)
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;
    }
}

uubf1zoe

uubf1zoe1#

问题是,在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将为您创建它们,更重要的是,将mocks注入到您的service对象中。

q0qdq0h2

q0qdq0h22#

Spring MVC的测试框架提供了类MockRestServiceServer,用于对RESTful服务代码进行单元测试。
下面是一个tutorial关于它的使用.

piztneat

piztneat3#

如果你使用@Autowired,你可以使用MockRestServiceServer。下面是示例。

@Service
public class Service{
    @Autowired
    private RestTemplate restTemplate;

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

字符串
@Service需要使用@Autowired来自动创建对象。

相关问题