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
这里Message
和MessageHeaders
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()
是一个可选的语法糖,可提高可读性。
我有一个 Message
object 和 MessageHeaders
字段。 MessageHeaders
class 实现了 Map<String, Object>
。我想断言我设置了特定的 headers。我在获取 MapAssert
方法时遇到问题。
这是我想要完成的:
assertThat(actual)
.extracting(Message::getHeaders) // This returns AbstractObjectAssert though
.containsKeys("some key"); // Not available
这里Message
和MessageHeaders
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()
是一个可选的语法糖,可提高可读性。