AssertJ 将提取的字段转换为 Map

Geo*_*rge 3 java assertj

我有一个MessageMessageHeaders字段的对象。本MessageHeaders类实现了Map<String, Object>。我想断言我设置了特定的标头。我很难找到MapAssert方法。

这是我想要完成的:

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

这是要明确的MessageandMessageHeaders类:

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


public class MessageHeaders implements Map<String, Object>, Serializable {
  // methods
}
Run Code Online (Sandbox Code Playgroud)

jot*_*ta3 9

为了使用,MapAssert您需要直接提取该MessageHeaders字段并使用以下命令进行提取asInstanceOf

assertThat(actual)
.extracting("headers")
.asInstanceOf(InstanceOfAssertFactories.MAP)
.containsKey("some key");
Run Code Online (Sandbox Code Playgroud)


Ste*_*dio 7

AssertJ Core 3.14.0提供了新的extracting()支持直接强制转换,因此你可以这样写:

assertThat(actual)
  .extracting(Message::getHeaders, as(InstanceOfAssertFactories.MAP))
  .containsKey("some key");
Run Code Online (Sandbox Code Playgroud)

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