如何在JavaSpring中模拟RestTemplate?
我尝试对一个包含restclient的服务进行一个简单的测试。看来我没有成功地模仿如何在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
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);
}