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;
}
}
型
3条答案
按热度按时间uubf1zoe1#
问题是,在
isEnabled
中,您正在创建一个新的RestTemplate。这是错误的,原因有两个,一是您不能模拟它,因为您正在创建一个新的,第二,避免为每个请求创建新对象是好的。RestTemplate是线程安全的,因此可以是一个服务类成员,可以跨多个线程使用。将您的服务类更改为如下所示:
字符串
现在你的RestTemplate已经成为了一个类成员,你可以通过两种方式之一来正确地模拟它:一种是使用
@InjectMock
注入,或者使用你从测试中调用的setter方法。既然你在代码中使用了InjectMock,我们可以使用它。
型
请注意,我做了一些修改。首先,我删除了
new RestTemplate()
和new Service()
。您应该让mockito为您创建它们。通过使用@Mock
和@Spy
注解它们,您将确保Mockito将为您创建它们,更重要的是,将mocks注入到您的service
对象中。q0qdq0h22#
Spring MVC的测试框架提供了类
MockRestServiceServer
,用于对RESTful服务代码进行单元测试。下面是一个tutorial关于它的使用.
piztneat3#
如果你使用@Autowired,你可以使用MockRestServiceServer。下面是示例。
字符串
@Service需要使用@Autowired来自动创建对象。