我正在寻找一种方法来测试一些给定的List是否是不可修改的.
我有一个对象,有一个List<NoMatter>,为了提供方法,addNoMatter(NoMatter nm)而不是允许API客户端只是做.getNoMatters().add(nm);我总是返回此列表的不可修改版本,所以客户端仍然能够拥有该列表.我按如下方式做到:
public List<NoMatter> getNoMatters() {
return Collections.unmodifiableList(this.noMatters);
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我正在进行测试时,我只是无法检查此对象是否为UnmodifiableList类型.我的第一次尝试是:
@Test
public void checkIfListIsImmutable(){
assertTrue("List is not immutable", this.myObj.getNoMatters() instanceof UnmodifiableList);
}
Run Code Online (Sandbox Code Playgroud)
碰巧我不能似乎能够导入类型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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:上面的测试不授予我我处理的列表不是不可变的,因为我需要测试每个可能修改我的原始列表的方法,包括.remove(),. clear(),. shuffle ()等!这就是为什么我认为这不是一个很好的方法.
>>>但我仍然相信它甚至不是一个优雅的解决方案!<<<
我需要从 an 中的每个元素获取一个对象Iterable并将其添加到List.
我可以使用下面的代码来做到这一点。ImmutableList但是,有没有什么方法可以在不显式实例化的情况下创建 Guava List?
List<Data> myList = new ArrayList<>();
myIterable.forEach(val ->
myList.add(val.getMetaData())
);
Run Code Online (Sandbox Code Playgroud)