Java AssertJ将提取的字段强制转换为地图

Java AssertJ将提取的字段强制转换为地图,java,assertj,Java,Assertj,我有一个带有MessageHeaders字段的Message对象。MessageHeaders类实现了一个Map。我想声明我设置了特定的头。我很难找到MapAssert方法 以下是我想要实现的目标: assertThat(actual) .extracting(Message::getHeaders) // This returns AbstractObjectAssert though .containsKeys("some key"); // Not available 下面是

我有一个带有
MessageHeaders
字段的
Message
对象。
MessageHeaders
类实现了一个
Map
。我想声明我设置了特定的头。我很难找到
MapAssert
方法

以下是我想要实现的目标:

assertThat(actual)
  .extracting(Message::getHeaders) // This returns AbstractObjectAssert though
  .containsKeys("some key");  // Not available 
下面是要明确的
消息
消息头
类:

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


public class MessageHeaders implements Map<String, Object>, Serializable {
  // methods
}
公共类消息{
私有消息头;
//吸气剂
}
公共类MessageHeaders实现映射,可序列化{
//方法
}

我提出的解决方案/解决方法是断言映射本身,而不是使用提取

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

要使用
MapAssert
,您需要直接提取
MessageHeaders
字段,并使用
asInstanceOf
强制执行提取:

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

AssertJ Core 3.14.0提供了一个支持直接铸造的新版本,因此您可以编写:

assertThat(actual)
  .extracting(Message::getHeaders, as(InstanceOfAssertFactories.MAP))
  .containsKey("some key");
请注意,这是一种可选语法,用于提高可读性。

asInstanceOf()
是在
AssertJ Core 3.13.0版本中引入的。我必须更新。