java - 如何测试 List<? extends Object> 是一个 UnmodifableList?

标签 java unit-testing collections tdd

我正在寻找一种方法来测试某个给定列表是否是不可修改的列表。

我有一个对象有 List<NoMatter> , 为了提供诸如 addNoMatter(NoMatter nm) 之类的方法而不是让 API 客户端简单地执行 .getNoMatters().add(nm);我总是返回此列表的不可修改版本,因此客户端仍然可以拥有该列表。我是这样做的:

public List<NoMatter> getNoMatters() {
    return Collections.unmodifiableList(this.noMatters);
}

问题是,当我进行测试时,我根本无法检查此对象是否属于 UnmodifiableList 类型。我的第一次尝试是:

@Test
public void checkIfListIsImmutable(){
    assertTrue("List is not immutable", this.myObj.getNoMatters() instanceof UnmodifiableList);
}

碰巧我似乎无法导入类型 UnmodifiableList都不是 java.util.Collections$UnmodifiableRandomAccessList这就是我尝试时得到的 System.out.println(myObj.getNoMatters().getClass().getName());在控制台。

那我怎样才能实现呢???

PS.: 我知道我可以通过这个测试:

@Test(expected = UnsupportedOperationException.class)
public void checkIfListIsImmutable(){
     this.myObj.getNoMatters().add(null);
}

编辑: 上面的测试并没有让我知道我正在处理的列表不是不可变的,因为我需要对可能修改我的原始列表的每个方法进行测试,包括 .remove ()、.clear()、.shuffle() 等!这就是为什么我不认为这是一个很好的方式进行。

>>> 但我仍然认为它离优雅的解决方案还差得很远! <<<

最佳答案

我认为你的解决方案不仅合理,而且优雅。你想测试你不能修改列表,你的测试简洁地证明了这一点。测试类的名称测试的是名称,而不是行为。在这种情况下,谁在乎名字?

同样,如果我想测试我不能将 null 传递给某些方法,我会在测试中传递 null 并期待 IllegalArgumentException。

关于java - 如何测试 List<? extends Object> 是一个 UnmodifableList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8364856/

相关文章:

java - java中的位和字节

java - CardView 无法正常工作

java - Spring Thymeleaf 将对象属性传递给 href 按钮提交

unit-testing - 如何正确排序单元测试测试用例?

collections - 给我一个实际的多集用例

java - 为什么当我尝试删除元素时此 ArrayList 会抛出 ConcurrentModificationException?

java - 在 mySQL 中创建数据库似乎无法正常工作

javascript - 在 Jest 中测试嵌套的 promise

swift - 如何在 swift 中模拟 realm-cocoa

java - 根据比赛ID检索单条记录