如何在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 response = restTemplate.getForEntity("someurl",String.class); if(...)return true; return false; } } 

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

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

 public class Service{ RestTemplate restTemplate = new RestTemplate(); public boolean isEnabled(String xxx) { ResponseEntity 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(), Matchers.any(Class.class) )) .thenReturn(responseEntity); boolean res = service.isEnabled("something"); Assert.assertEquals(res, false); } 

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

Spring MVC的测试框架提供了类MockRestServiceServer用于unit testingRESTful服务代码。

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

如果您使用@Autowired,则可以使用MockRestServiceServer。 以下是样本。

 @Service public class Service{ @Autowired private RestTemplate restTemplate; public boolean isEnabled(String xxx) { ResponseEntity response = restTemplate.getForEntity("someurl",String.class); if(...)return true; return false; } } 

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