gpt4 book ai didi

java - 如何在 Java Spring 中模拟 RestTemplate?

转载 作者:太空狗 更新时间:2023-10-29 22:51:42 25 4
gpt4 key购买 nike

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;
}
}

最佳答案

问题是在您的 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 注入(inject)它,或使用您从测试中调用的 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()new Service()。你应该让 mockito 为你创建那些。通过使用 @Mock@Spy 注释它们,您将确保 Mockito 会为您创建它们,更重要的是,会将模拟注入(inject)您的服务对象。

关于java - 如何在 Java Spring 中模拟 RestTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42406625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com