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;
}
}
原文由 c2340878 发布,翻译遵循 CC BY-SA 4.0 许可协议
问题是在您的
isEnabled
中,您正在创建一个新的 RestTemplate。这是错误的,原因有二,一是你不能模拟它,因为你正在创建一个新对象,二是最好避免为每个请求创建新对象。 RestTemplate 是线程安全的,因此可以成为服务类成员,跨多个线程使用。将您的服务类别更改为如下所示:
现在您的 RestTemplate 已成为类成员,您现在可以通过两种方式之一正确模拟。第一,使用
@InjectMock
注入它,或使用您从测试中调用的 setter 方法。由于您在代码中使用了 InjectMock,我们可以使用它。
请注意,我做了一些更改。首先,我删除了
new RestTemplate()
和new Service()
。你应该让 mockito 为你创建那些。通过用@Mock
和@Spy
注释它们,您将确保 Mockito 会为您创建它们,更重要的是,会将模拟注入到您的service