gpt4 book ai didi

junit - 如何使用 mockito 模拟 ObjectMapper.readValue()

转载 作者:行者123 更新时间:2023-12-04 12:03:45 25 4
gpt4 key购买 nike

我正在测试服务层,但不确定如何模拟 ObjectMapper().readValue在那个类(class)。我对 mockito 还很陌生并且可以弄清楚该怎么做。

以下是我的代码,

服务.java

private configDetail fetchConfigDetail(String configId) throws IOException {
final String response = restTemplate.getForObject(config.getUrl(), String.class);
return new ObjectMapper().readValue(response, ConfigDetail.class);
}

服务测试.java
@Test
public void testgetConfigDetailReturnsNull() throws Exception {

restTemplate = Mockito.mock(restTemplate.class);
Service service = new Service();
Config config = Mockito.mock(Config.class);
ObjectMapper objMapper = Mockito.mock(ObjectMapper.class);
Mockito.doReturn("").when(restTemplate).getForObject(anyString(), eq(String.class));
Mockito.doReturn(configDetail).when(objMapper).readValue(anyString(),eq(ConfigDetail.class));
assertEquals(configDetail, service.getConfigDetail("1234"));
}

运行此测试时,我得到以下结果,
com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input
at [Source: (String)""; line: 1, column: 0]

在此处发布 ServiceTest.Java
@RunWith(MockitoJUnitRunner.class)
public class ConfigServiceTest {

@Mock
private ConfigPersistenceService persistenceService;

@InjectMocks
private ConfigService configService;

@Mock
ConfigDetail configDetail;

@Mock
private RestTemplate restTemplate;

@Mock
private ObjectMapper objMapper;

@Mock
private Config config;

@Test
public void testgetConfigDetailReturnsNull() throws Exception {

ObjectMapper objMapper = Mockito.mock(ObjectMapper.class);
Mockito.doReturn(ucpConfig).when(persistenceService).findById("1234");

Mockito.doReturn("").when(restTemplate).getForObject(anyString(), eq(String.class));

Mockito.when((objMapper).readValue(“”,ConfigDetail.class)).thenReturn(configDetail);
assertEquals(ConfigDetail, ConfigService.getConfigDetail("1234"));
}
}

最佳答案

使用您当前的 Service 类将很难模拟 ObjectMapper , ObjectMapperfetchConfigDetail 紧密耦合方法。

你必须改变你的服务类如下模拟 ObjectMapper .

@Service
public class MyServiceImpl {

@Autowired
private ObjectMapper objectMapper;

private configDetail fetchConfigDetail(String configId) throws IOException {
final String response = restTemplate.getForObject(config.getUrl(), String.class);
return objectMapper.readValue(response, ConfigDetail.class);
}
}

我在这里所做的不是创建 objectMapper在我从外部注入(inject)的方法内部(在这种情况下, objectMapper 将由 Spring 创建)

更改服务类别后,您可以模拟 objectMapper如下。
ObjectMapper mockObjectMapper = Mockito.mock(ObjectMapper.class);
Mockito.when(mockObjectMapper.readValue(anyString(), any(ConfigDetail.class)).thenReturn(configDetail);

关于junit - 如何使用 mockito 模拟 ObjectMapper.readValue(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48575356/

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