我正在使用AssertJ
。我有一个像MyObj
这样的课程。我有一个List
MyObj
。
Class MyObj {
...
Map<K,V> myMap;
...
}
当我使用时:
assertThat(list).extracting("myMap")
,我无法使用.containsKey()
方法。assertThat(list).extracting("myMap", Map.class)
,但它也不起作用。使用它的正确方法是什么?
答案 0 :(得分:1)
您在assertj-examples中有可执行的示例,特别是IterableAssertionsExamples。
希望它有所帮助!
答案 1 :(得分:1)
断言地图内容的最简单方法是链接extracting
方法:
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");
答案 2 :(得分:0)
它有点复杂,但绝对可能:
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);
}
}
}
答案 3 :(得分:0)
一种方法是从Map
中提取List
并按照此处的建议验证其内容 - Assertj Core Features,如下所示:
@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;
}
答案 4 :(得分:0)
AssertJ具有entry()方法。 您可以这样声明地图值。
assertThat(list)
.extracting("myMap")
.contains(entry("foo1", "bar1"), entry("foo2", "bar2"));
这是javadoc:http://joel-costigliola.github.io/assertj/core/api/org/assertj/core/data/MapEntry.html
答案 5 :(得分:0)
如果要使用 containsKey
方法,必须在编译时知道键的类型(即不能依赖泛型)。假设 myMap
是您可以执行的 Map<String, Long>
:
assertThat(list)
.extracting("myMap")
.asInstanceOf(InstanceOfAssertFactories.map(String.class, Long.class))
.containsKey("key");