AssertJ 将提取的字段转换为 Map

AssertJ casting an extracted field to a Map

我有一个 Message object 和 MessageHeaders 字段。 MessageHeaders class 实现了 Map<String, Object>。我想断言我设置了特定的 headers。我在获取 MapAssert 方法时遇到问题。

这是我想要完成的:

assertThat(actual)
  .extracting(Message::getHeaders) // This returns AbstractObjectAssert though
  .containsKeys("some key");  // Not available 

这里MessageMessageHeaders class要清楚:

public class Message {
  private MessageHeaders headers;
  // getter
}


public class MessageHeaders implements Map<String, Object>, Serializable {
  // methods
}

我想出的解决方案/解决方法是断言地图本身而不是使用提取。

assertThat(actual.getHeaders())
  .containsKey("some key");

为了使用 MapAssert,您需要直接提取 MessageHeaders 字段并使用 asInstanceOf 转换提取:

assertThat(actual)
.extracting("headers")
.asInstanceOf(InstanceOfAssertFactories.MAP)
.containsKey("some key");

AssertJ Core 3.14.0 提供了一个新的extracting()来支持直接转换,所以你可以这样写:

assertThat(actual)
  .extracting(Message::getHeaders, as(InstanceOfAssertFactories.MAP))
  .containsKey("some key");

请注意,as() 是一个可选的语法糖,可提高可读性。