[英]How to mock RestTemplate in Java Spring?
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;
}
}
问题是,在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
对象。
Spring MVC的测试框架提供了类MockRestServiceServer
用于单元测试RESTful服务代码。
这是一个关于它的使用的教程 。
如果您使用@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自动创建对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.