如何在Java Spring中模拟RestTemplate? [英] 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
。它看起来像代码获得真实数据而不是模拟数据。任何人都可以帮助我。
I tried to test a simple test for a service including a restclient. It looks I have not Mock the RestTemplate
successfully. It looks like the code get the real data not the mock one. Anyone can help me with this.
服务本身看起来像这样:
The service itself will looks as this:
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是线程安全的,因此可以是服务类成员,用于多个线程。
The problem is that in your isEnabled
you are creating a new RestTemplate. This is wrong for two reasons, one is that you cannot mock it since you are creating a new one, and second it is good to avoid creating new objects per request. RestTemplate is thread safe and hence can be a service class member, being used across many threads.
将您的服务类更改为以下内容:
Change your service class to something like this:
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方法。
Now that your RestTemplate has become a class member you can now properly mock through one of two ways. One, inject it using the @InjectMock
, or use a setter method that you call from your test.
自你在代码中使用InjectMock我们可以使用它。
Since you are using InjectMock in your code we can go with that.
@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);
}
请注意,我做了一些更改。首先,我删除了新的RestTemplate()
和新的Service()
。你应该让mockito为你创造这些。通过使用 @Mock
和 @Spy
注释它们,您将确保Mockito将为您创建它们,更重要的是,将模拟注入服务
对象。
Notice that I made a few changes. First, I removed the new RestTemplate()
and new Service()
. You should let mockito create those for you. By annotating them with @Mock
and @Spy
you will ensure that Mockito will create them for you, and more importantly, will inject the mocks into your service
object.
这篇关于如何在Java Spring中模拟RestTemplate?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!