gpt4 book ai didi

java - AssertJ `containsExactly` 带有通配符的断言列表

转载 作者:行者123 更新时间:2023-11-30 06:25:10 25 4
gpt4 key购买 nike

我有一个 getter 返回带有通配符的列表:

import java.util.List;

public interface Foo {
List<? extends Bar> getList();
}

哪里Bar是另一个接口(interface)。

当我像这样使用 AssertJ 编写断言时:

assertThat(foo.getList()).containsExactly(bar1, bar3);

编辑:我的完整用法是链接 usingElementComparator并提供Comparator<Bar>比较预期的Bar实例。

Comparator<Bar> comparator = createBarComparator()
assertThat(foo.getList()).usingElementComparator(comparator).containsExactly(bar1, bar3);

我收到此编译错误:

The method containsExactly(capture#46-of ? extends Bar...) in the type ListAssert is not applicable for the arguments (Bar, Bar)

<小时/>

我的第一个解决方案是转换结果:

assertThat((List<Bar>)foo.getList()).containsExactly(bar1, bar3);

然后我收到警告:

Type safety: Unchecked cast from List to List

可以使用 @SuppressWarnings("unchecked") 删除警告,但中间的强制转换仍然无法使断言真正具有可读性。

<小时/>

我的第二个解决方案是指示 ELEMENT 通用参数的值:

Assertions.<Bar>assertThat(foo.getList()).containsExactly(bar1, bar3);

好一点,但也不是那么好(不可能静态导入,行的开头不利于可读性)

<小时/>

我想我正在寻找另一个assertThat列表的方法,其中类类型可以指定为第二个参数:

@CheckReturnValue
public static <ELEMENT> ListAssert<ELEMENT> assertThat(List<? extends ELEMENT> actual, Class<ELEMENT> c) {
return AssertionsForInterfaceTypes.assertThat(actual);
}

这样我应该能够写出这样的东西:

Assertions.assertThat(foo.getList(), Bar.class).containsExactly(bar1, bar3);

最佳答案

过去可以与 Oracle JDK 7 编译器一起使用,但这实际上是编译器中的一个错误,这已在 Java 8 JDK 中修复,因此编译错误是正常行为(尽管找不到错误引用) .

我很乐意支持,但我不确定这在 AssertJ 中是否可行,除非删除集合断言中的所有泛型使用。

assertThat(List, Class) 已经存在,但出于其他目的,所以该选项不走运。

一个可能的技巧是定义您自己的 assertThat像这样的方法:

public static <T> ListAssert<Object> assertThat(final List<T> list) {
return Assertions.assertThat(list);
}

诀窍是返回 ListAssert<Object> .

虽然我理解编译错误的基本原理,但我不同意它的只读方法。

关于java - AssertJ `containsExactly` 带有通配符的断言列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47317425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com