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哎呀!!!谢谢!这是一个地图列表!我没听懂。