Java Optional.ofNullable与Mockito和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:无法识别的类型:[null]

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

iCMS 回答:Java Optional.ofNullable与Mockito和ObjectMapper

Why doesn't Mockito mock static methods?所述

您不能通过使用模仿来模拟静态方法。 无论如何,我猜您的目标是检查此实用程序方法是否按预期运行,以防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

本文链接:https://www.f2er.com/1989972.html

大家都在问