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);
}
我尝试对包含休息客户端的服务进行简单的测试。看来我还没有嘲笑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()
and new Service()
。你应该让mockito为你创建这些。通过注释它们@Mock
and @Spy
您将确保 Mockito 将为您创建它们,更重要的是,会将模拟注入到您的service
object.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)