Mockito ::传递对象时JsonProcessingException的单元测试用例

Mockito:: Unit test case for JsonProcessingException when passing object

我有一个class如下图:

@Getter
@Setter
public class User{

    @Autowired
    Logger log;

    private String name;
    private String age;

    public String toJson(){
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonString = null;
        try{
            jsonString = objectMapper.writeValueAsString(this);
        }catch(JsonProcessingException jsnEx){
            log.writeErr(" Error while parsing the Json" + jsnEx.getMessage());
        }
        return jsonString;
    }
}

现在我正在尝试为此编写一个 单元测试 案例,我可以抛出异常并使用 Mockito 对 catch 子句进行单元测试,但我无法模拟它。我注意到对象映射器 class 在内部将所有内容转换为字符串,即使我将 name 和 age 设置为 null。谁能帮我解决这个问题?

在 Spring 中使用构造函数注入。这将允许您在 class 中注入模拟的 ObjectMapper,然后您可以在测试中设置行为。见下文。

@Getter
@Setter
public class User{

    private String name;
    private String age;
    
    private final Logger log;
    private final ObjectMapper objectMapper;
    
    public User(Logger log, ObjectMapper objectMapper){
        this.log = log;
        this.objectMapper = objectMapper;
    }

    public String toJson(){
        String jsonString = null;
        try{
            jsonString = objectMapper.writeValueAsString(this);
        }catch(JsonProcessingException jsnEx){
            log.writeErr(" Error while parsing the Json" + jsnEx.getMessage());
        }
        return jsonString;
    }
}


// Test

@Before
public setup(){
    @Mock
    Logger log;
    
    @Mock
    ObjectMapper objectMapper;        
    testObject = new User(log, objectMapper);
}

@Test
public test_toJson(){
    // given
    when(objectMapper.writeValueAsString(any())).thenThrow(new JsonProcessingException("Fake exception"))
    // when
    testObject.toJson()
}