我正在寻找一种方法来测试某个给定列表是否是不可修改的列表。
我有一个对象有 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/