如何在JavaSpring中模拟RestTemplate?

如何在JavaSpring中模拟RestTemplate?,java,unit-testing,spring-mvc,mockito,Java,Unit Testing,Spring Mvc,Mockito,我尝试对一个包含restclient的服务进行一个简单的测试。看来我没有成功地模仿restmplate。看起来代码得到的是真实数据,而不是模拟数据。任何人都可以帮我 服务本身将如下所示: public class ServiceTest { @Mock RestTemplate restTemplate = new RestTemplate(); @InjectMocks Service service = new Service(); ResponseE

我尝试对一个包含restclient的服务进行一个简单的测试。看来我没有成功地模仿
restmplate
。看起来代码得到的是真实数据,而不是模拟数据。任何人都可以帮我

服务本身将如下所示:

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);
    }
公共类服务{
公共布尔值isEnabled(字符串xxx){
RestTemplate RestTemplate=新RestTemplate();
ResponseEntity response=restemplate.getForEntity(“someurl”,String.class);
如果(…)返回true;
返回false;
}
}

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


下面是一个关于其使用的示例。

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

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;
    }
}
@服务
公务舱服务{
@自动连线
私有RestTemplate RestTemplate;
公共布尔值isEnabled(字符串xxx){
ResponseEntity response=restemplate.getForEntity(“someurl”,String.class);
如果(…)返回true;
返回false;
}
}

@服务需要使用@Autowired自动创建对象。

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

将您的服务类别更改为以下内容:

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

注意,我做了一些更改。首先,我删除了
新RestTemplate()
新服务()。你应该让mockito为你创建这些。通过使用
@Mock
@Spy
对它们进行注释,您将确保Mockito将为您创建它们,更重要的是,将Mock注入您的
服务
对象。

我尝试了本教程,但它不起作用。我试过了,但它会返回restTemplate为null的错误。看起来我不能注入restbean模板。我还能做些什么来测试它吗?我只需要模仿RestTemplete的响应。对不起,我没有在类中添加重要性注释。请再看看我的答案。
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;
    }
}
@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);
    }