首页 > 解决方案 > 验证 Jackon JsonAnySetter 被称为 Junit

问题描述

我有一个 POJO,我正在使用 Jackson 将其反序列化为 POJO。我想记录我不知道的键值属性。为此,我以下列方式使用 JsonAnySetter:

@Value
@Slf4j
@Builder
public class Book {
  private String titleId;
  private String bookName;
  private List<String> authors;

  @JsonAnySetter
  public void ignored(String key, Object value) {
        log.warn("Received a key which hasn't been mapped. Key: {}, Value: {}", key, value);
    }
}

现在要在我的 Junit 中对此进行测试,如何验证是否调用了忽略的方法?

@Test
public void given_unknown_key_ensure_it_is_logged() {
   ObjectMapper objectMapper = new ObjectMapper();
   String test = "{\"randomField\": \"test\"}";
   Book book = objectMapper.readValue(test, Book.class);
  ArgumentCaptor<Book> captor = ArgumentCaptor.forClass(Book.class);
   verify(book, times(1)).ignored("randomField", "test");
}

我需要使用实际的 Book 对象,但这也必须被模拟,所以不确定在这种情况下我应该如何进行。

标签: javajunitjava-8jacksonmockito

解决方案


创建对象的模拟对象Log并在Book类中设置。

这假设 Log 对象是静态的,这似乎是合理的。


推荐阅读