Java Optional.ofNullable with Mockito and ObjectMapper



我有如下函数从任何有效负载生成提供类型的对象:

public static <T> Optional<T> generateObject(String payloadJson, Class<T> type) {
T objectPayload = null;
try {
objectPayload = objectMapper.readValue(payloadJson, type);
}catch (IOException e) {
log.info(e.getMessage());
}
return Optional.ofNullable(objectPayload);
}

编写了如下测试用例

@Test
void generateObject() throws Exception {
Mockito.when( eventUtil.generateObject("a", Mockito.any(Class.class)) ).thenReturn( Optional.of("") );
Mockito.<Optional<Object>>when( eventUtil.generateObject("b", Mockito.any(Class.class)) ).thenReturn( Optional.of("") );
Optional<Object> o2 = eventUtil.generateObject("b", Mockito.any(Class.class));
assertEquals( "lol", o2.get() );
Mockito.verify(eventUtil);
}

测试执行在 Mockito.when 语句上失败

java.lang.IllegalArgumentException: unrecognized Type: [null]

**注意:我尝试使用thenReturn( Optional.of(((提供 null、另一个模型类甚至父类本身,但没有运气。在这种情况下,请指出我正确的方向。

如前所述 为什么 Mockito 不模拟静态方法?

不能使用 mockito 模拟静态方法。 无论如何,我想您的目标是检查此实用程序方法是否按预期运行,以防 objectMapper 抛出异常或工作正常。 因此,您可以使该方法非静态,然后您可以注入objectMapper并尝试类似的东西:

@Test
void objectMapperThrowsException() throws Exception {
ObjectMapper mapper = Mockito.mock(ObjectMapper.class);
EventUtil eventUtil = new EventUtil(mapper);
Mockito.when(mapper.readValue(any(),any())).thenThrow(IOException.class);
Optional<Object> result = eventUtil.generateObject("b", Object.class);
assertTrue(result.isEmpty());
}

和积极案例

@Test
void objectMapperReturnAValidObject() throws Exception {
Object anObject = new Object();
ObjectMapper mapper = Mockito.mock(ObjectMapper.class);
EventUtil eventUtil = new EventUtil(mapper);
Mockito.when(mapper.readValue(any(),any())).thenReturn(anObject);
Optional<Object> result = eventUtil.generateObject("b", Object.class);
assertFalse(result.isEmpty());
assertEquals(anObject, result.get());
}

测试此方法的最佳方法是将任何数据类型转换为 JSON 并调用该方法以转换为原始数据类型,尝试使用帮助程序类或任何其他数据类型

public class TargetTest {
@Test
void generateObject() throws Exception {
// Arrange
ObjectMapper mapper = new ObjectMapper();
Helper helper = new Helper();
helper.setName("test");
String json = mapper.writeValueAsString(helper );
// Act
Helper actual = EventUtil.generateObject(json, Helper.class);
// Assert
}
class Helper {
private String name;

// Getter and setter
}
}

,如果你想模拟它,试着用PowerMockito

最新更新