当前位置: 首页 > 知识库问答 >
问题:

断言两个列表按一定顺序具有相同的子类型

范安歌
2023-03-14

我想检查两个列表(比方说,ArrayList)是否有完全相同的实例类,基于预期的列表。为此,我构建了下一个方法,但我想知道是否有另一种使用某些库的奇特方法,比如assertJ。

    private void assertConcreteTypes(List actual, List expected) {
        for (int i = 0; i < actual.size(); i++){
            assertThat(actual.get(i)).isExactlyInstanceOf(expected.get(i).getClass());
        }
    }

任何建议都是非常受欢迎的。谢谢

共有2个答案

邹阳
2023-03-14

您可以创建自定义Assertj断言器和可用于断言类型的自定义断言器。

class TypeAssert extends AbstractAssert<TypeAssert, List<?>> {

    public TypeAssert(List<?> actual) {
        super(actual, TypeAssert.class);
    }

    public TypeAssert hasExactlySameType(List<?> expected) {
        isNotNull();
        for (int i = 0; i < actual.size(); i++) {
            if (!actual.get(i).getClass().equals(expected.get(i).getClass())) {
                failWithMessage("Expected [%s]th element to be of type: %s but was of type: %s",
                    i, expected.get(i).getClass(), actual.get(i).getClass());
            }
        }

        return this;
    }
}

您需要一个静态方法来公开我们的自定义导出器的对象。

class Assertions {

    // static factory method which exposes custom asserted
    static TypeAssert assertThat(List<?> actual) {
        return new TypeAssert(actual);
    }
}

然后可以使用上述方法进行基于类型的断言。

List<Object> actual = List.of(new Employee());
List<Object> expected = List.of(new StringBuilder());

Assertions.assertThat(actual).hasExactlySameType(expected);

如果您仅在1或2个位置基于类型进行断言,那么我认为您提到的方法更加清晰易读。但是,如果您需要在多个地方创建这样的断言,那么我建议您创建一个自定义断言器。

郁光熙
2023-03-14

您需要考虑不同大小的列表以及列表中的空元素。

这似乎相当易读,并迎合了这些边缘情况:

private void assertConcreteTypes(List actual, List expected) {
    assertEquals(classes(expected), classes(actual));
}

private List<Class<?>> classes(List<Object> list) {
    return list.stream().map(v -> v == null ? null : v.getClass()).collect(Collectors.toList());
}
 类似资料:
  • 我有一个算法包含以下情况;我想知道是否有可能有所改进(我认为不可能,但我可能错了)。 我有一个对象列表。我有两个不同的(独立的)键来对它们进行排序:和。实际上,我可以在算法开始时以两种方式对列表进行排序,而无需花费大量成本;因此,我有两份清单: (Python语法,但我认为任何人都能理解)。在这个阶段,只要复杂性保持在O(nlogn)以下,我完全可以做更多的事情(初始化新变量)。 我需要提取的许多

  • 每个人如何检查两个堆栈是否具有相同的值? 例如,在stack1中我有[1,3,4,5],在stack2中我有[4,3,1,5],因此堆栈具有相同的值,并且Method需要返回true。 此外,堆栈必须(最终)与给定的堆栈相同(具有原始值和相同的顺序)。 我已经开始做了,但不幸的是,效果不好: 提前谢谢。

  • 我正在运行以下JOOQ查询: table和joinTable都有id作为主键名称,但最终获取实体类包含joinTable的id和table的其余列。如果我重新排序表,结果相似,我有表的ID和joinTable的其余列。

  • 问题内容: 我有两个表,它们的定义如下: 和这里代表。 我做了一个简单的本地SQL只能加入到选择和为: 但是我在行上遇到异常: 堆栈跟踪 : 您能建议出什么事了吗? 问题答案: 您需要设置结果别名。

  • 问题内容: 很抱歉这个简单的问题,但是我很难找到答案。 当我比较2个列表时,我想知道它们是否“相等”,因为它们具有相同的内容,但是顺序不同。 例如: 我想评估。 问题答案: 您可以简单地检查带有x和y元素的多重集是否相等: 这要求元素是可哈希的。运行时将位于中,其中列表大小。 如果元素也是唯一的,则还可以转换为集合(相同的渐近运行时,在实践中可能会快一点): 如果元素不是可哈希的,而是可排序的,则