Java 如何使用assertj提取地图属性
我正在使用Java 如何使用assertj提取地图属性,java,junit,assert,assertj,Java,Junit,Assert,Assertj,我正在使用AssertJ。我有一个类似于MyObj的类。我有一个列表的MyObj Class MyObj { ... Map<K,V> myMap; ... } 类MyObj{ ... 地图我的地图; ... } 当我使用: assertThat(list).提取(“myMap”),我不能使用.containsKey()方法 我还尝试使用assertThat(list).提取(“myMap”,Map.class),但它也不起作用 使用它的正确方法是什么?这
AssertJ
。我有一个类似于MyObj的类。我有一个列表的MyObj
Class MyObj {
...
Map<K,V> myMap;
...
}
类MyObj{
...
地图我的地图;
...
}
当我使用:
assertThat(list).提取(“myMap”)
,我不能使用.containsKey()
方法
我还尝试使用assertThat(list).提取(“myMap”,Map.class)
,但它也不起作用
使用它的正确方法是什么?这里记录了提取功能:
在中有可执行示例,特别是在中
希望有帮助 有点复杂,但绝对有可能:
public class Main {
public static void main(String[] args) {
MyObject<String, Integer> myObject1 = new MyObject<>("A", 1);
MyObject<String, Integer> myObject2 = new MyObject<>("B", 2);
MyObject<String, Integer> myObject3 = new MyObject<>("C", 3);
List<MyObject<String, Integer>> myObjects = Arrays.asList(myObject1, myObject2, myObject3);
assertThat(myObjects).extracting("myMap", Map.class).is(containingKey("A"), atIndex(0))
.is(containingKey("B"), atIndex(1))
.is(containingKey("C"), atIndex(2));
}
private static class MapContainsKeyCondition<K> extends Condition<Map> {
private final K keyToContain;
public MapContainsKeyCondition(K key) {
this.keyToContain = key;
}
@Override
public boolean matches(Map map) {
return map.containsKey(keyToContain);
}
}
private static <K> Condition<Map> containingKey(K key) {
return new MapContainsKeyCondition<>(key);
}
public static class MyObject<K, V> {
final Map<K, V> myMap;
public MyObject(K key, V value) {
this.myMap = Collections.singletonMap(key, value);
}
}
}
公共类主{
公共静态void main(字符串[]args){
MyObject MyObject 1=新的MyObject(“A”,1);
MyObject MyObject 2=新的MyObject(“B”,2);
MyObject MyObject 3=新的MyObject(“C”,3);
List myObjects=Arrays.asList(myObject1、myObject2、myObject3);
assertThat(myObjects).extracting(“myMap”,Map.class).is(containingKey(“A”),atIndex(0))
.is(包含键(“B”),索引(1))
.is(包含键(“C”)、索引(2));
}
私有静态类MapContainsKeyCondition扩展条件{
私人最终K钥匙盒;
公共映射包含条件(K键){
this.keyToContain=key;
}
@凌驾
公共布尔匹配(映射){
返回地图。containsKey(keyToContain);
}
}
私有静态条件包含密钥(K密钥){
返回新的MapContainesKeyCondition(键);
}
公共静态类MyObject{
最终地图myMap;
公共MyObject(K键,V值){
this.myMap=Collections.singletonMap(键,值);
}
}
}
断言地图内容的最简单方法是链接提取方法:
MyObj o1 = new MyObj();
o1.getMyMap().put("foo", "Hello");
o1.getMyMap().put("bar", "Bye");
MyObj o2 = new MyObj();
o2.getMyMap().put("foo", "Hola");
o2.getMyMap().put("bar", "Adios");
List<MyObj> myObjs = Arrays.asList(o1, o2);
assertThat(myObjs).extracting("myMap").extracting("foo").contains("Hello", "Hola");
assertThat(myObjs).extracting("myMap").extracting("bar").contains("Bye", "Adios");
MyObj o1=新的MyObj();
o1.getMyMap().put(“foo”,“Hello”);
o1.getMyMap().put(“bar”,“Bye”);
MyObj o2=新的MyObj();
o2.getMyMap().put(“foo”,“Hola”);
o2.getMyMap().put(“bar”,“Adios”);
List myObjs=Arrays.asList(o1,o2);
资产(myObjs)。提取(“myMap”)。提取(“foo”)。包含(“你好”,“你好”);
资产(myObjs)。提取(“myMap”)。提取(“bar”)。包含(“再见”、“再见”);
一种方法是从列表
中提取地图
,并验证其内容,如下所示:
@Test
public void getMyObjList() {
assertThat(list).isNotEmpty().extracting("myMap")
.isNotEmpty().contains(geMap());
}
private Map<String, Integer> geMap() {
final Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
return map;
}
@测试
public void getMyObjList(){
assertThat(list).isNotEmpty().正在提取(“myMap”)
.isNotEmpty().contains(geMap());
}
私有映射geMap(){
final Map=new HashMap();
地图放置(“A”,1);
地图放置(“B”,2);
返回图;
}
AssertJ有entry()方法。
您可以这样断言映射值
assertThat(list)
.extracting("myMap")
.contains(entry("foo1", "bar1"), entry("foo2", "bar2"));
下面是javadoc:为什么不在变量中获取映射并在其上使用assertj?@fge这是一种方法。但我想知道有没有更简单的方法可以直接提取映射属性。从对象列表中提取映射属性可以对映射列表进行断言。为什么您可以在地图列表上使用containsKey?地图列表没有键。@JBNizet哎呀!!!谢谢!这是一个地图列表!我没听懂。